From 296fa6ee9ee63089603c8bb13bb7d3346f85a037 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 22 Oct 2023 13:27:31 +0100 Subject: Add explicit visibility --- .../ast/untyped/UntypedFunctionDefinitionNode.java | 12 ++++++ .../compiler/typechecker/DeclaredVariable.java | 2 + .../compiler/typechecker/DeclaredVariables.java | 7 ++++ .../shedlang/compiler/typechecker/TypeChecker.java | 5 ++- .../compiler/ast/typed/TypedNodeMatchers.java | 10 ----- .../typechecker/TypeCheckerNamespaceTests.java | 49 ++++++++++++++++++---- 6 files changed, 65 insertions(+), 20 deletions(-) (limited to 'src') 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 isTypedNamespaceNode( - Matcher> body, - Matcher> fieldNames - ) { - return allOf( - has("body", x -> x.body(), body), - has("fieldNames", x -> x.fieldNames(), fieldNames) - ); - } - public static Matcher isTypedParamNode( String name, Matcher> 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)) ))) ); } -- cgit v1.2.3