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 --- .../compiler/ast/untyped/UntypedFunctionDefinitionNode.java | 12 ++++++++++++ .../org/shedlang/compiler/typechecker/DeclaredVariable.java | 2 ++ .../org/shedlang/compiler/typechecker/DeclaredVariables.java | 7 +++++++ .../java/org/shedlang/compiler/typechecker/TypeChecker.java | 5 ++++- 4 files changed, 25 insertions(+), 1 deletion(-) (limited to 'src/main/java') 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()) -- cgit v1.2.3