aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-10-22 13:27:31 +0100
committerMichael Williamson <mike@zwobble.org>2023-10-22 13:27:31 +0100
commit296fa6ee9ee63089603c8bb13bb7d3346f85a037 (patch)
tree0754151b4533fd9c9c315ef361879fdc12160cdd /src
parent5831a308f4d8f9e83821fffff67a2141cc76d26b (diff)
Add explicit visibility
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionDefinitionNode.java12
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/DeclaredVariable.java2
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/DeclaredVariables.java7
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java5
-rw-r--r--src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java10
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerNamespaceTests.java49
6 files changed, 65 insertions, 20 deletions
diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionDefinitionNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionDefinitionNode.java
index 65e4f84c..c81a4409 100644
--- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionDefinitionNode.java
+++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFunctionDefinitionNode.java
@@ -121,5 +121,17 @@ public record UntypedFunctionDefinitionNode(
this.body.plus(statement)
);
}
+
+ public Builder withVisibility(Visibility visibility) {
+ return new Builder(
+ this.name,
+ visibility,
+ this.positionalParams,
+ this.namedParams,
+ this.effect,
+ this.returnType,
+ this.body
+ );
+ }
}
}
diff --git a/src/main/java/org/shedlang/compiler/typechecker/DeclaredVariable.java b/src/main/java/org/shedlang/compiler/typechecker/DeclaredVariable.java
index 08d45542..bed7501e 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/DeclaredVariable.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/DeclaredVariable.java
@@ -1,10 +1,12 @@
package org.shedlang.compiler.typechecker;
import org.shedlang.compiler.sources.Source;
+import org.shedlang.compiler.types.Visibility;
public record DeclaredVariable(
String name,
VariableType variableType,
+ Visibility visibility,
Source source
) {
}
diff --git a/src/main/java/org/shedlang/compiler/typechecker/DeclaredVariables.java b/src/main/java/org/shedlang/compiler/typechecker/DeclaredVariables.java
index 2950b170..f9878a53 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/DeclaredVariables.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/DeclaredVariables.java
@@ -2,6 +2,7 @@ package org.shedlang.compiler.typechecker;
import org.pcollections.PVector;
import org.shedlang.compiler.ast.untyped.*;
+import org.shedlang.compiler.types.Visibility;
import java.util.List;
@@ -53,6 +54,7 @@ class DeclaredVariables {
return variables.plus(new DeclaredVariable(
import_.variableName(),
VariableType.IMPORT,
+ Visibility.PRIVATE,
import_.source()
));
}
@@ -91,6 +93,7 @@ class DeclaredVariables {
variables.plus(new DeclaredVariable(
functionDefinition.name(),
VariableType.CONSTANT,
+ functionDefinition.visibility(),
functionDefinition.source()
));
@@ -98,6 +101,7 @@ class DeclaredVariables {
variables.plus(new DeclaredVariable(
struct.name(),
VariableType.CONSTANT,
+ Visibility.PRIVATE,
struct.source()
));
@@ -105,6 +109,7 @@ class DeclaredVariables {
variables.plus(new DeclaredVariable(
sumType.name(),
VariableType.CONSTANT,
+ Visibility.PRIVATE,
sumType.source()
));
};
@@ -129,6 +134,7 @@ class DeclaredVariables {
variables.plus(new DeclaredVariable(
var.name(),
VariableType.VAR,
+ Visibility.PRIVATE,
var.source()
));
@@ -136,6 +142,7 @@ class DeclaredVariables {
variables.plus(new DeclaredVariable(
val.name(),
VariableType.VAL,
+ val.visibility(),
val.source()
));
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index 9040f9df..f4033702 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -787,7 +787,6 @@ public class TypeChecker {
var declaredVariables = DeclaredVariables.forImports(untyped.imports(), P.vector());
declaredVariables = DeclaredVariables.forNamespaceStatements(untyped.body(), declaredVariables);
- // TODO: explicit exports
var namespaceFinalContext = context;
var fieldTypes = declaredVariables.stream()
@@ -798,6 +797,10 @@ public class TypeChecker {
case VAL -> true;
case VAR -> false;
})
+ .filter(variable -> switch (variable.visibility()) {
+ case PUBLIC -> true;
+ case PRIVATE -> false;
+ })
.map(variable -> Map.entry(
variable.name(),
namespaceFinalContext.compileTimeLookup(variable.name())
diff --git a/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java b/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java
index dde00bca..c5a27329 100644
--- a/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java
+++ b/src/test/java/org/shedlang/compiler/ast/typed/TypedNodeMatchers.java
@@ -195,16 +195,6 @@ public class TypedNodeMatchers {
return TypedNamespaceNodeMatcher.empty();
}
- public static Matcher<TypedNamespaceNode> isTypedNamespaceNode(
- Matcher<Iterable<? extends TypedNamespaceStatementNode>> body,
- Matcher<? super Iterable<? extends String>> fieldNames
- ) {
- return allOf(
- has("body", x -> x.body(), body),
- has("fieldNames", x -> x.fieldNames(), fieldNames)
- );
- }
-
public static Matcher<TypedParamNode> isTypedParamNode(
String name,
Matcher<TypedTypeLevelExpressionNode<?>> type
diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerNamespaceTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerNamespaceTests.java
index bddd7ba6..85515dad 100644
--- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerNamespaceTests.java
+++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerNamespaceTests.java
@@ -29,7 +29,9 @@ public class TypeCheckerNamespaceTests {
assertThat(
result.value(),
- isTypedNamespaceNode(isSequence(), isSequence())
+ isTypedNamespaceNode()
+ .withImports(isSequence())
+ .withBody(isSequence())
);
}
@@ -70,12 +72,9 @@ public class TypeCheckerNamespaceTests {
assertThat(
result.value(),
- isTypedNamespaceNode(
- isSequence(
- isTypedFunctionDefinitionNode().withName("f")
- ),
- isSequence(equalTo("f"))
- )
+ isTypedNamespaceNode().withBody(isSequence(
+ isTypedFunctionDefinitionNode().withName("f")
+ ))
);
}
@@ -493,7 +492,7 @@ public class TypeCheckerNamespaceTests {
}
@Test
- public void typesOfFieldsAreStored() {
+ public void namespaceFieldsIncludesPublicFields() {
var namespaceName = NamespaceName.of("Example");
var untyped = Untyped.namespace(
namespaceName,
@@ -501,6 +500,38 @@ public class TypeCheckerNamespaceTests {
UntypedFunctionDefinitionNode.builder()
.withName("f")
.withReturnType(Untyped.typeLevelReference("Unit"))
+ .withVisibility(Visibility.PRIVATE)
+ .build(),
+ UntypedFunctionDefinitionNode.builder()
+ .withName("g")
+ .withReturnType(Untyped.typeLevelReference("Unit"))
+ .withVisibility(Visibility.PUBLIC)
+ .build()
+ )
+ );
+ var context = TypeCheckerContext.EMPTY
+ .enterGlobal(P.map(Map.entry("Unit", Types.metaType(Types.UNIT))));
+
+ var result = TypeChecker.typeCheckNamespace(untyped, context);
+
+ assertThat(result.value().fieldNames(), isSequence(equalTo("g")));
+ }
+
+ @Test
+ public void namespaceTypeIncludesPublicFields() {
+ var namespaceName = NamespaceName.of("Example");
+ var untyped = Untyped.namespace(
+ namespaceName,
+ List.of(
+ UntypedFunctionDefinitionNode.builder()
+ .withName("f")
+ .withReturnType(Untyped.typeLevelReference("Unit"))
+ .withVisibility(Visibility.PRIVATE)
+ .build(),
+ UntypedFunctionDefinitionNode.builder()
+ .withName("g")
+ .withReturnType(Untyped.typeLevelReference("Unit"))
+ .withVisibility(Visibility.PUBLIC)
.build()
)
);
@@ -515,7 +546,7 @@ public class TypeCheckerNamespaceTests {
assertThat(
namespaceTypeInfo,
equalTo(NamespaceTypeInfo.fromFields(P.orderedMap(
- Map.entry("f", new FunctionType(List.of(), List.of(), Effects.NONE, Types.UNIT))
+ Map.entry("g", new FunctionType(List.of(), List.of(), Effects.NONE, Types.UNIT))
)))
);
}