Browse Source

- Added access & static checks to validator

- Removed export access and added internal access support
Stan Hebben 6 years ago
parent
commit
4ada6df10e
44 changed files with 818 additions and 107 deletions
  1. 2
    2
      CodeFormatter/src/main/java/org/openzen/zenscript/formatter/FormattingUtils.java
  2. 56
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/AccessScope.java
  3. 15
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/HighLevelDefinition.java
  4. 7
    3
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/Modifiers.java
  5. 5
    3
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/ScriptBlock.java
  6. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/definition/FunctionDefinition.java
  7. 4
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ConstMember.java
  8. 2
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ConstructorMember.java
  9. 5
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/FunctionalMember.java
  10. 3
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/GetterMember.java
  11. 5
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/IDefinitionMember.java
  12. 4
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ImplementationMember.java
  13. 4
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/SetterMember.java
  14. 7
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/DefinitionMemberRef.java
  15. 21
    21
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/member/TypeMemberBuilder.java
  16. 10
    1
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaExpressionVisitor.java
  17. 7
    3
      JavaShared/src/main/java/org/openzen/zenscript/javashared/prepare/JavaPrepareClassMethodVisitor.java
  18. 4
    6
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaDefinitionVisitor.java
  19. 3
    3
      Parser/src/main/java/org/openzen/zenscript/parser/ParsedFile.java
  20. 2
    2
      Parser/src/main/java/org/openzen/zenscript/parser/member/ParsedDefinitionMember.java
  21. 83
    0
      ScriptingExample/scripts/classes.zs
  22. 58
    0
      ScriptingExample/scripts/conditionals.zs
  23. 20
    0
      ScriptingExample/scripts/functions.zs
  24. 19
    0
      ScriptingExample/scripts/functions2.zs
  25. 1
    0
      ScriptingExample/scripts/functions3.zs
  26. 22
    0
      ScriptingExample/scripts/functions_lambdas.zs
  27. 7
    0
      ScriptingExample/scripts/helloworld.zs
  28. 51
    0
      ScriptingExample/scripts/match.zs
  29. 94
    0
      ScriptingExample/scripts/moreHellos.zs
  30. 2
    0
      ScriptingExample/scripts/statements.zs
  31. 18
    0
      ScriptingExample/scripts/switch.zs
  32. 70
    0
      ScriptingExample/scripts/variants.zs
  33. 12
    12
      ScriptingExample/src/main/java/org/openzen/zenscript/scriptingexample/GlobalRegistry.java
  34. 2
    1
      Validator/src/main/java/org/openzen/zenscript/validator/TypeContext.java
  35. 4
    1
      Validator/src/main/java/org/openzen/zenscript/validator/ValidationLogEntry.java
  36. 12
    1
      Validator/src/main/java/org/openzen/zenscript/validator/Validator.java
  37. 12
    9
      Validator/src/main/java/org/openzen/zenscript/validator/analysis/ExpressionScope.java
  38. 3
    0
      Validator/src/main/java/org/openzen/zenscript/validator/analysis/StatementScope.java
  39. 53
    16
      Validator/src/main/java/org/openzen/zenscript/validator/visitors/DefinitionMemberValidator.java
  40. 18
    10
      Validator/src/main/java/org/openzen/zenscript/validator/visitors/DefinitionValidator.java
  41. 61
    0
      Validator/src/main/java/org/openzen/zenscript/validator/visitors/ExpressionValidator.java
  42. 6
    0
      Validator/src/main/java/org/openzen/zenscript/validator/visitors/StatementValidator.java
  43. 2
    1
      Validator/src/main/java/org/openzen/zenscript/validator/visitors/TypeValidator.java
  44. 21
    10
      Validator/src/main/java/org/openzen/zenscript/validator/visitors/ValidationUtils.java

+ 2
- 2
CodeFormatter/src/main/java/org/openzen/zenscript/formatter/FormattingUtils.java View File

46
 			output.append("protected ");
46
 			output.append("protected ");
47
 		if (Modifiers.isPublic(modifiers))
47
 		if (Modifiers.isPublic(modifiers))
48
 			output.append("public ");
48
 			output.append("public ");
49
-		if (Modifiers.isExport(modifiers))
50
-			output.append("export ");
49
+		if (Modifiers.isInternal(modifiers))
50
+			output.append("internal ");
51
 		if (Modifiers.isStatic(modifiers))
51
 		if (Modifiers.isStatic(modifiers))
52
 			output.append("static ");
52
 			output.append("static ");
53
 		if (Modifiers.isAbstract(modifiers))
53
 		if (Modifiers.isAbstract(modifiers))

+ 56
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/AccessScope.java View File

1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.codemodel;
7
+
8
+import java.util.Objects;
9
+
10
+/**
11
+ *
12
+ * @author Hoofdgebruiker
13
+ */
14
+public final class AccessScope {
15
+	public final Module module;
16
+	public final HighLevelDefinition definition;
17
+	
18
+	public AccessScope(Module module, HighLevelDefinition definition) {
19
+		this.module = module;
20
+		this.definition = definition;
21
+	}
22
+	
23
+	public boolean hasAccessTo(AccessScope other, int access) {
24
+		if (Modifiers.isPublic(access))
25
+			return true;
26
+		if (definition == other.definition)
27
+			return true;
28
+		if (Modifiers.isPrivate(access))
29
+			return false;
30
+		if (Modifiers.isInternal(access))
31
+			return module == other.module;
32
+		if (Modifiers.isProtected(access))
33
+			return definition.isSubclassOf(other.definition);
34
+		
35
+		return false;
36
+	}
37
+
38
+	@Override
39
+	public int hashCode() {
40
+		int hash = 7;
41
+		hash = 79 * hash + Objects.hashCode(this.module);
42
+		hash = 79 * hash + Objects.hashCode(this.definition);
43
+		return hash;
44
+	}
45
+
46
+	@Override
47
+	public boolean equals(Object obj) {
48
+		if (this == obj)
49
+			return true;
50
+		if (obj == null || getClass() != obj.getClass())
51
+			return false;
52
+		
53
+		final AccessScope other = (AccessScope) obj;
54
+		return module == other.module && definition == other.definition;
55
+	}
56
+}

+ 15
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/HighLevelDefinition.java View File

27
 import org.openzen.zenscript.codemodel.member.ImplementationMember;
27
 import org.openzen.zenscript.codemodel.member.ImplementationMember;
28
 import org.openzen.zenscript.codemodel.member.InnerDefinitionMember;
28
 import org.openzen.zenscript.codemodel.member.InnerDefinitionMember;
29
 import org.openzen.zenscript.codemodel.scope.TypeScope;
29
 import org.openzen.zenscript.codemodel.scope.TypeScope;
30
+import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
30
 import org.openzen.zenscript.codemodel.type.TypeID;
31
 import org.openzen.zenscript.codemodel.type.TypeID;
31
 
32
 
32
 /**
33
 /**
84
 			isDestructible |= outerDefinition.isDestructible;
85
 			isDestructible |= outerDefinition.isDestructible;
85
 	}
86
 	}
86
 	
87
 	
88
+	public boolean isSubclassOf(HighLevelDefinition other) {
89
+		if (superType.isDefinition(other))
90
+			return true;
91
+		if (superType == null || !(superType instanceof DefinitionTypeID))
92
+			return false;
93
+		
94
+		DefinitionTypeID superDefinition = (DefinitionTypeID)superType;
95
+		return superDefinition.definition.isSubclassOf(other);
96
+	}
97
+	
87
 	public int getNumberOfGenericParameters() {
98
 	public int getNumberOfGenericParameters() {
88
 		return typeParameters == null ? 0 : typeParameters.length;
99
 		return typeParameters == null ? 0 : typeParameters.length;
89
 	}
100
 	}
146
 		this.typeParameters = typeParameters;
157
 		this.typeParameters = typeParameters;
147
 	}
158
 	}
148
 	
159
 	
160
+	public AccessScope getAccessScope() {
161
+		return new AccessScope(module, this);
162
+	}
163
+	
149
 	public List<FieldMember> getFields() {
164
 	public List<FieldMember> getFields() {
150
 		List<FieldMember> fields = new ArrayList<>();
165
 		List<FieldMember> fields = new ArrayList<>();
151
 		for (IDefinitionMember member : members)
166
 		for (IDefinitionMember member : members)

+ 7
- 3
CodeModel/src/main/java/org/openzen/zenscript/codemodel/Modifiers.java View File

13
 	private Modifiers() {}
13
 	private Modifiers() {}
14
 	
14
 	
15
 	public static final int PUBLIC = 1;
15
 	public static final int PUBLIC = 1;
16
-	public static final int EXPORT = 2;
16
+	public static final int INTERNAL = 2;
17
 	public static final int PRIVATE = 4;
17
 	public static final int PRIVATE = 4;
18
 	public static final int ABSTRACT = 8;
18
 	public static final int ABSTRACT = 8;
19
 	public static final int FINAL = 16;
19
 	public static final int FINAL = 16;
30
 		return (modifiers & PUBLIC) > 0;
30
 		return (modifiers & PUBLIC) > 0;
31
 	}
31
 	}
32
 	
32
 	
33
-	public static boolean isExport(int modifiers) {
34
-		return (modifiers & EXPORT) > 0;
33
+	public static boolean isInternal(int modifiers) {
34
+		return (modifiers & INTERNAL) > 0;
35
 	}
35
 	}
36
 	
36
 	
37
 	public static boolean isProtected(int modifiers) {
37
 	public static boolean isProtected(int modifiers) {
77
 	public static boolean isOverride(int modifiers) {
77
 	public static boolean isOverride(int modifiers) {
78
 		return (modifiers & OVERRIDE) > 0;
78
 		return (modifiers & OVERRIDE) > 0;
79
 	}
79
 	}
80
+	
81
+	public static boolean hasAccess(int modifiers) {
82
+		return (modifiers & (PRIVATE | PUBLIC | PROTECTED | INTERNAL)) > 0;
83
+	}
80
 }
84
 }

+ 5
- 3
CodeModel/src/main/java/org/openzen/zenscript/codemodel/ScriptBlock.java View File

19
  * @author Hoofdgebruiker
19
  * @author Hoofdgebruiker
20
  */
20
  */
21
 public class ScriptBlock extends Taggable {
21
 public class ScriptBlock extends Taggable {
22
+	public final Module module;
22
 	public final ZSPackage pkg;
23
 	public final ZSPackage pkg;
23
 	public final List<Statement> statements;
24
 	public final List<Statement> statements;
24
 	
25
 	
25
-	public ScriptBlock(ZSPackage pkg, List<Statement> statements) {
26
+	public ScriptBlock(Module module, ZSPackage pkg, List<Statement> statements) {
27
+		this.module = module;
26
 		this.pkg = pkg;
28
 		this.pkg = pkg;
27
 		this.statements = statements;
29
 		this.statements = statements;
28
 	}
30
 	}
29
 	
31
 	
30
 	public ScriptBlock withStatements(List<Statement> newStatements) {
32
 	public ScriptBlock withStatements(List<Statement> newStatements) {
31
-		ScriptBlock result = new ScriptBlock(pkg, newStatements);
33
+		ScriptBlock result = new ScriptBlock(module, pkg, newStatements);
32
 		result.addAllTagsFrom(this);
34
 		result.addAllTagsFrom(this);
33
 		return result;
35
 		return result;
34
 	}
36
 	}
38
 		for (Statement statement : statements) {
40
 		for (Statement statement : statements) {
39
 			normalized.add(statement.normalize(scope, ConcatMap.empty(LoopStatement.class, LoopStatement.class)));
41
 			normalized.add(statement.normalize(scope, ConcatMap.empty(LoopStatement.class, LoopStatement.class)));
40
 		}
42
 		}
41
-		ScriptBlock result = new ScriptBlock(pkg, normalized);
43
+		ScriptBlock result = new ScriptBlock(module, pkg, normalized);
42
 		result.addAllTagsFrom(this);
44
 		result.addAllTagsFrom(this);
43
 		return result;
45
 		return result;
44
 	}
46
 	}

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/definition/FunctionDefinition.java View File

40
 	
40
 	
41
 	public void setHeader(GlobalTypeRegistry registry, FunctionHeader header) {
41
 	public void setHeader(GlobalTypeRegistry registry, FunctionHeader header) {
42
 		this.header = header;
42
 		this.header = header;
43
-		addMember(caller = new CallerMember(position, this, modifiers | Modifiers.STATIC, header, null));
43
+		addMember(caller = new CallerMember(position, this, Modifiers.PUBLIC | Modifiers.STATIC, header, null));
44
 		callerGroup.addMethod(new FunctionalMemberRef(caller, registry.getFunction(header).stored(StaticStorageTag.INSTANCE), GenericMapper.EMPTY), TypeMemberPriority.SPECIFIED);
44
 		callerGroup.addMethod(new FunctionalMemberRef(caller, registry.getFunction(header).stored(StaticStorageTag.INSTANCE), GenericMapper.EMPTY), TypeMemberPriority.SPECIFIED);
45
 	}
45
 	}
46
 	
46
 	

+ 4
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ConstMember.java View File

9
 import org.openzen.zenscript.codemodel.FunctionHeader;
9
 import org.openzen.zenscript.codemodel.FunctionHeader;
10
 import org.openzen.zenscript.codemodel.GenericMapper;
10
 import org.openzen.zenscript.codemodel.GenericMapper;
11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
+import org.openzen.zenscript.codemodel.Modifiers;
12
 import org.openzen.zenscript.codemodel.expression.Expression;
13
 import org.openzen.zenscript.codemodel.expression.Expression;
13
 import org.openzen.zenscript.codemodel.member.ref.ConstMemberRef;
14
 import org.openzen.zenscript.codemodel.member.ref.ConstMemberRef;
14
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
15
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
59
 
60
 
60
 	@Override
61
 	@Override
61
 	public void normalize(TypeScope scope) {
62
 	public void normalize(TypeScope scope) {
63
+		if (!Modifiers.hasAccess(modifiers))
64
+			modifiers |= Modifiers.INTERNAL;
65
+		
62
 		type = type.getNormalized();
66
 		type = type.getNormalized();
63
 		value = value.normalize(scope);
67
 		value = value.normalize(scope);
64
 	}
68
 	}

+ 2
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ConstructorMember.java View File

97
 	public void normalize(TypeScope scope) {
97
 	public void normalize(TypeScope scope) {
98
 		if (definition instanceof EnumDefinition)
98
 		if (definition instanceof EnumDefinition)
99
 			modifiers |= Modifiers.PRIVATE;
99
 			modifiers |= Modifiers.PRIVATE;
100
+		else if (!Modifiers.hasAccess(modifiers))
101
+			modifiers |= Modifiers.INTERNAL;
100
 		
102
 		
101
 		super.normalize(scope);
103
 		super.normalize(scope);
102
 	}
104
 	}

+ 5
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/FunctionalMember.java View File

10
 import org.openzen.zenscript.codemodel.FunctionHeader;
10
 import org.openzen.zenscript.codemodel.FunctionHeader;
11
 import org.openzen.zenscript.codemodel.GenericMapper;
11
 import org.openzen.zenscript.codemodel.GenericMapper;
12
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
13
+import org.openzen.zenscript.codemodel.Modifiers;
13
 import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
14
 import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
14
 import org.openzen.zenscript.codemodel.scope.TypeScope;
15
 import org.openzen.zenscript.codemodel.scope.TypeScope;
15
 import org.openzen.zenscript.codemodel.statement.LoopStatement;
16
 import org.openzen.zenscript.codemodel.statement.LoopStatement;
50
 		return new FunctionalMemberRef(this, type, null);
51
 		return new FunctionalMemberRef(this, type, null);
51
 	}
52
 	}
52
 	
53
 	
54
+	@Override
53
 	public FunctionalMemberRef ref(StoredType type, GenericMapper mapper) {
55
 	public FunctionalMemberRef ref(StoredType type, GenericMapper mapper) {
54
 		return new FunctionalMemberRef(this, type, mapper);
56
 		return new FunctionalMemberRef(this, type, mapper);
55
 	}
57
 	}
61
 
63
 
62
 	@Override
64
 	@Override
63
 	public void normalize(TypeScope scope) {
65
 	public void normalize(TypeScope scope) {
66
+		if (!Modifiers.hasAccess(modifiers))
67
+			modifiers |= Modifiers.INTERNAL;
68
+		
64
 		header = header.normalize(scope.getTypeRegistry());
69
 		header = header.normalize(scope.getTypeRegistry());
65
 		if (body != null)
70
 		if (body != null)
66
 			body = body.normalize(scope, ConcatMap.empty(LoopStatement.class, LoopStatement.class));
71
 			body = body.normalize(scope, ConcatMap.empty(LoopStatement.class, LoopStatement.class));

+ 3
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/GetterMember.java View File

10
 import org.openzen.zenscript.codemodel.FunctionHeader;
10
 import org.openzen.zenscript.codemodel.FunctionHeader;
11
 import org.openzen.zenscript.codemodel.GenericMapper;
11
 import org.openzen.zenscript.codemodel.GenericMapper;
12
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
13
+import org.openzen.zenscript.codemodel.Modifiers;
13
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
14
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
14
 import org.openzen.zenscript.codemodel.member.ref.GetterMemberRef;
15
 import org.openzen.zenscript.codemodel.member.ref.GetterMemberRef;
15
 import org.openzen.zenscript.codemodel.scope.TypeScope;
16
 import org.openzen.zenscript.codemodel.scope.TypeScope;
81
 
82
 
82
 	@Override
83
 	@Override
83
 	public void normalize(TypeScope scope) {
84
 	public void normalize(TypeScope scope) {
85
+		if (!Modifiers.hasAccess(modifiers))
86
+			modifiers |= Modifiers.INTERNAL;
84
 		if (body != null)
87
 		if (body != null)
85
 			body = body.normalize(scope, ConcatMap.empty(LoopStatement.class, LoopStatement.class));
88
 			body = body.normalize(scope, ConcatMap.empty(LoopStatement.class, LoopStatement.class));
86
 	}
89
 	}

+ 5
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/IDefinitionMember.java View File

6
 package org.openzen.zenscript.codemodel.member;
6
 package org.openzen.zenscript.codemodel.member;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.AccessScope;
9
 import org.openzen.zenscript.codemodel.FunctionHeader;
10
 import org.openzen.zenscript.codemodel.FunctionHeader;
10
 import org.openzen.zenscript.codemodel.GenericMapper;
11
 import org.openzen.zenscript.codemodel.GenericMapper;
11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
55
 	DefinitionMemberRef ref(StoredType type, GenericMapper mapper);
56
 	DefinitionMemberRef ref(StoredType type, GenericMapper mapper);
56
 	
57
 	
57
 	FunctionHeader getHeader();
58
 	FunctionHeader getHeader();
59
+	
60
+	default AccessScope getAccessScope() {
61
+		return getDefinition().getAccessScope();
62
+	}
58
 }
63
 }

+ 4
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ImplementationMember.java View File

11
 import org.openzen.zenscript.codemodel.FunctionHeader;
11
 import org.openzen.zenscript.codemodel.FunctionHeader;
12
 import org.openzen.zenscript.codemodel.GenericMapper;
12
 import org.openzen.zenscript.codemodel.GenericMapper;
13
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
13
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
14
+import org.openzen.zenscript.codemodel.Modifiers;
14
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
15
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
15
 import org.openzen.zenscript.codemodel.member.ref.ImplementationMemberRef;
16
 import org.openzen.zenscript.codemodel.member.ref.ImplementationMemberRef;
16
 import org.openzen.zenscript.codemodel.scope.TypeScope;
17
 import org.openzen.zenscript.codemodel.scope.TypeScope;
74
 
75
 
75
 	@Override
76
 	@Override
76
 	public void normalize(TypeScope scope) {
77
 	public void normalize(TypeScope scope) {
78
+		if (!Modifiers.hasAccess(modifiers))
79
+			modifiers |= Modifiers.PUBLIC;
80
+		
77
 		for (IDefinitionMember member : members)
81
 		for (IDefinitionMember member : members)
78
 			member.normalize(scope);
82
 			member.normalize(scope);
79
 	}
83
 	}

+ 4
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/SetterMember.java View File

11
 import org.openzen.zenscript.codemodel.FunctionParameter;
11
 import org.openzen.zenscript.codemodel.FunctionParameter;
12
 import org.openzen.zenscript.codemodel.GenericMapper;
12
 import org.openzen.zenscript.codemodel.GenericMapper;
13
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
13
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
14
+import org.openzen.zenscript.codemodel.Modifiers;
14
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
15
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
15
 import org.openzen.zenscript.codemodel.member.ref.SetterMemberRef;
16
 import org.openzen.zenscript.codemodel.member.ref.SetterMemberRef;
16
 import org.openzen.zenscript.codemodel.scope.TypeScope;
17
 import org.openzen.zenscript.codemodel.scope.TypeScope;
81
 
82
 
82
 	@Override
83
 	@Override
83
 	public void normalize(TypeScope scope) {
84
 	public void normalize(TypeScope scope) {
85
+		if (!Modifiers.hasAccess(modifiers))
86
+			modifiers |= Modifiers.INTERNAL;
87
+		
84
 		if (body != null)
88
 		if (body != null)
85
 			body = body.normalize(scope, ConcatMap.empty(LoopStatement.class, LoopStatement.class));
89
 			body = body.normalize(scope, ConcatMap.empty(LoopStatement.class, LoopStatement.class));
86
 	}
90
 	}

+ 7
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/DefinitionMemberRef.java View File

20
 	
20
 	
21
 	String describe();
21
 	String describe();
22
 	
22
 	
23
-	<T> T getTag(Class<T> type);
23
+	default <T> T getTag(Class<T> type) {
24
+		return getTarget().getTag(type);
25
+	}
26
+	
27
+	default boolean hasTag(Class<?> type) {
28
+		return getTarget().hasTag(type);
29
+	}
24
 	
30
 	
25
 	StoredType getOwnerType();
31
 	StoredType getOwnerType();
26
 	
32
 	

+ 21
- 21
CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/member/TypeMemberBuilder.java View File

173
 	
173
 	
174
 	@Override
174
 	@Override
175
 	public Void visitString(Void context, StringTypeID string) {
175
 	public Void visitString(Void context, StringTypeID string) {
176
-		ClassDefinition builtin = new ClassDefinition(BUILTIN, Module.BUILTIN, null, "string", Modifiers.EXPORT, null);
176
+		ClassDefinition builtin = new ClassDefinition(BUILTIN, Module.BUILTIN, null, "string", Modifiers.PUBLIC, null);
177
 		
177
 		
178
 		constructor(builtin, STRING_CONSTRUCTOR_CHARACTERS, new StoredType(registry.getOptional(registry.getArray(CHAR.stored, 1)), BorrowStorageTag.INVOCATION));
178
 		constructor(builtin, STRING_CONSTRUCTOR_CHARACTERS, new StoredType(registry.getOptional(registry.getArray(CHAR.stored, 1)), BorrowStorageTag.INVOCATION));
179
 		
179
 		
199
 
199
 
200
 	@Override
200
 	@Override
201
 	public Void visitArray(Void context, ArrayTypeID array) {
201
 	public Void visitArray(Void context, ArrayTypeID array) {
202
-		HighLevelDefinition definition = new ClassDefinition(BUILTIN, Module.BUILTIN, null, "", Modifiers.EXPORT);
202
+		HighLevelDefinition definition = new ClassDefinition(BUILTIN, Module.BUILTIN, null, "", Modifiers.PUBLIC);
203
 		StoredType baseType = array.elementType;
203
 		StoredType baseType = array.elementType;
204
 		int dimension = array.dimension;
204
 		int dimension = array.dimension;
205
 		StorageTag storage = type.getActualStorage();
205
 		StorageTag storage = type.getActualStorage();
350
 		StoredType keyType = assoc.keyType;
350
 		StoredType keyType = assoc.keyType;
351
 		StoredType valueType = assoc.valueType;
351
 		StoredType valueType = assoc.valueType;
352
 		
352
 		
353
-		ClassDefinition builtin = new ClassDefinition(BUILTIN, Module.BUILTIN, null, "", Modifiers.EXPORT);
353
+		ClassDefinition builtin = new ClassDefinition(BUILTIN, Module.BUILTIN, null, "", Modifiers.PUBLIC);
354
 		
354
 		
355
 		constructor(builtin, ASSOC_CONSTRUCTOR);
355
 		constructor(builtin, ASSOC_CONSTRUCTOR);
356
 
356
 
398
 		FunctionHeader putHeader = new FunctionHeader(new TypeParameter[] { functionParameter }, VOID.stored, null, null, new FunctionParameter(valueType));
398
 		FunctionHeader putHeader = new FunctionHeader(new TypeParameter[] { functionParameter }, VOID.stored, null, null, new FunctionParameter(valueType));
399
 		FunctionHeader containsHeader = new FunctionHeader(new TypeParameter[] { functionParameter }, BOOL.stored, null, null, FunctionParameter.NONE);
399
 		FunctionHeader containsHeader = new FunctionHeader(new TypeParameter[] { functionParameter }, BOOL.stored, null, null, FunctionParameter.NONE);
400
 		
400
 		
401
-		ClassDefinition builtin = new ClassDefinition(BUILTIN, Module.BUILTIN, null, "", Modifiers.EXPORT);
401
+		ClassDefinition builtin = new ClassDefinition(BUILTIN, Module.BUILTIN, null, "", Modifiers.PUBLIC);
402
 		constructor(builtin, GENERICMAP_CONSTRUCTOR);
402
 		constructor(builtin, GENERICMAP_CONSTRUCTOR);
403
 		
403
 		
404
 		method(builtin, "getOptional", getOptionalHeader, GENERICMAP_GETOPTIONAL);
404
 		method(builtin, "getOptional", getOptionalHeader, GENERICMAP_GETOPTIONAL);
431
 
431
 
432
 	@Override
432
 	@Override
433
 	public Void visitFunction(Void context, FunctionTypeID function) {
433
 	public Void visitFunction(Void context, FunctionTypeID function) {
434
-		FunctionDefinition builtin = new FunctionDefinition(BUILTIN, Module.BUILTIN, null, "", Modifiers.EXPORT, function.header, registry);
435
-		new CallerMember(BUILTIN, builtin, 0, function.header, FUNCTION_CALL).registerTo(members, TypeMemberPriority.SPECIFIED, null);
434
+		FunctionDefinition builtin = new FunctionDefinition(BUILTIN, Module.BUILTIN, null, "", Modifiers.PUBLIC, function.header, registry);
435
+		new CallerMember(BUILTIN, builtin, Modifiers.PUBLIC, function.header, FUNCTION_CALL).registerTo(members, TypeMemberPriority.SPECIFIED, null);
436
 		
436
 		
437
 		same(builtin, FUNCTION_SAME, type);
437
 		same(builtin, FUNCTION_SAME, type);
438
 		notsame(builtin, FUNCTION_NOTSAME, type);
438
 		notsame(builtin, FUNCTION_NOTSAME, type);
555
 	public Void visitRange(Void context, RangeTypeID range) {
555
 	public Void visitRange(Void context, RangeTypeID range) {
556
 		StoredType baseType = range.baseType;
556
 		StoredType baseType = range.baseType;
557
 
557
 
558
-		ClassDefinition definition = new ClassDefinition(BUILTIN, Module.BUILTIN, null, "", Modifiers.EXPORT);
558
+		ClassDefinition definition = new ClassDefinition(BUILTIN, Module.BUILTIN, null, "", Modifiers.PUBLIC);
559
 		getter(definition, RANGE_FROM, "from", baseType);
559
 		getter(definition, RANGE_FROM, "from", baseType);
560
 		getter(definition, RANGE_TO, "to", baseType);
560
 		getter(definition, RANGE_TO, "to", baseType);
561
 		if (baseType.type == BYTE
561
 		if (baseType.type == BYTE
577
 
577
 
578
 	@Override
578
 	@Override
579
 	public Void visitModified(Void context, OptionalTypeID modified) {
579
 	public Void visitModified(Void context, OptionalTypeID modified) {
580
-		ClassDefinition builtin = new ClassDefinition(BUILTIN, Module.BUILTIN, null, "modified", Modifiers.EXPORT, null);
580
+		ClassDefinition builtin = new ClassDefinition(BUILTIN, Module.BUILTIN, null, "modified", Modifiers.PUBLIC, null);
581
 		modified.baseType.accept(context, this);
581
 		modified.baseType.accept(context, this);
582
 		
582
 		
583
 		if (modified.isOptional()) {
583
 		if (modified.isOptional()) {
590
 	}
590
 	}
591
 	
591
 	
592
 	private void visitBool() {
592
 	private void visitBool() {
593
-		ClassDefinition builtin = new ClassDefinition(BUILTIN, Module.BUILTIN, null, "bool", Modifiers.EXPORT, null);
593
+		ClassDefinition builtin = new ClassDefinition(BUILTIN, Module.BUILTIN, null, "bool", Modifiers.PUBLIC, null);
594
 		not(builtin, BOOL_NOT, BOOL);
594
 		not(builtin, BOOL_NOT, BOOL);
595
 		and(builtin, BOOL_AND, BOOL, BOOL);
595
 		and(builtin, BOOL_AND, BOOL, BOOL);
596
 		or(builtin, BOOL_OR, BOOL, BOOL);
596
 		or(builtin, BOOL_OR, BOOL, BOOL);
605
 	}
605
 	}
606
 	
606
 	
607
 	private void visitByte() {
607
 	private void visitByte() {
608
-		ClassDefinition builtin = new ClassDefinition(BUILTIN, Module.BUILTIN, null, "byte", Modifiers.EXPORT, null);
608
+		ClassDefinition builtin = new ClassDefinition(BUILTIN, Module.BUILTIN, null, "byte", Modifiers.PUBLIC, null);
609
 		
609
 		
610
 		invert(builtin, BYTE_NOT, BYTE);
610
 		invert(builtin, BYTE_NOT, BYTE);
611
 		inc(builtin, BYTE_INC, BYTE);
611
 		inc(builtin, BYTE_INC, BYTE);
645
 	}
645
 	}
646
 	
646
 	
647
 	private void visitSByte() {
647
 	private void visitSByte() {
648
-		ClassDefinition builtin = new ClassDefinition(BUILTIN, Module.BUILTIN, null, "sbyte", Modifiers.EXPORT, null);
648
+		ClassDefinition builtin = new ClassDefinition(BUILTIN, Module.BUILTIN, null, "sbyte", Modifiers.PUBLIC, null);
649
 		
649
 		
650
 		invert(builtin, SBYTE_NOT, SBYTE);
650
 		invert(builtin, SBYTE_NOT, SBYTE);
651
 		neg(builtin, SBYTE_NEG, SBYTE);
651
 		neg(builtin, SBYTE_NEG, SBYTE);
687
 	}
687
 	}
688
 	
688
 	
689
 	private void visitShort() {
689
 	private void visitShort() {
690
-		ClassDefinition builtin = new ClassDefinition(BUILTIN, Module.BUILTIN, null, "short", Modifiers.EXPORT, null);
690
+		ClassDefinition builtin = new ClassDefinition(BUILTIN, Module.BUILTIN, null, "short", Modifiers.PUBLIC, null);
691
 		
691
 		
692
 		invert(builtin, SHORT_NOT, SHORT);
692
 		invert(builtin, SHORT_NOT, SHORT);
693
 		neg(builtin, SHORT_NEG, SHORT);
693
 		neg(builtin, SHORT_NEG, SHORT);
729
 	}
729
 	}
730
 	
730
 	
731
 	private void visitUShort() {
731
 	private void visitUShort() {
732
-		ClassDefinition builtin = new ClassDefinition(BUILTIN, Module.BUILTIN, null, "ushort", Modifiers.EXPORT, null);
732
+		ClassDefinition builtin = new ClassDefinition(BUILTIN, Module.BUILTIN, null, "ushort", Modifiers.PUBLIC, null);
733
 		
733
 		
734
 		invert(builtin, USHORT_NOT, USHORT);
734
 		invert(builtin, USHORT_NOT, USHORT);
735
 		inc(builtin, USHORT_INC, USHORT);
735
 		inc(builtin, USHORT_INC, USHORT);
769
 	}
769
 	}
770
 	
770
 	
771
 	private void visitInt() {
771
 	private void visitInt() {
772
-		ClassDefinition builtin = new ClassDefinition(BUILTIN, Module.BUILTIN, null, "int", Modifiers.EXPORT, null);
772
+		ClassDefinition builtin = new ClassDefinition(BUILTIN, Module.BUILTIN, null, "int", Modifiers.PUBLIC, null);
773
 		
773
 		
774
 		invert(builtin, INT_NOT, INT);
774
 		invert(builtin, INT_NOT, INT);
775
 		neg(builtin, INT_NEG, INT);
775
 		neg(builtin, INT_NEG, INT);
850
 	}
850
 	}
851
 
851
 
852
 	private void visitUInt() {
852
 	private void visitUInt() {
853
-		ClassDefinition builtin = new ClassDefinition(BUILTIN, Module.BUILTIN, null, "uint", Modifiers.EXPORT, null);
853
+		ClassDefinition builtin = new ClassDefinition(BUILTIN, Module.BUILTIN, null, "uint", Modifiers.PUBLIC, null);
854
 		
854
 		
855
 		invert(builtin, UINT_NOT, INT);
855
 		invert(builtin, UINT_NOT, INT);
856
 		inc(builtin, UINT_DEC, INT);
856
 		inc(builtin, UINT_DEC, INT);
930
 	}
930
 	}
931
 	
931
 	
932
 	private void visitLong() {
932
 	private void visitLong() {
933
-		ClassDefinition builtin = new ClassDefinition(BUILTIN, Module.BUILTIN, null, "long", Modifiers.EXPORT, null);
933
+		ClassDefinition builtin = new ClassDefinition(BUILTIN, Module.BUILTIN, null, "long", Modifiers.PUBLIC, null);
934
 		
934
 		
935
 		invert(builtin, LONG_NOT, LONG);
935
 		invert(builtin, LONG_NOT, LONG);
936
 		neg(builtin, LONG_NEG, LONG);
936
 		neg(builtin, LONG_NEG, LONG);
1003
 	}
1003
 	}
1004
 	
1004
 	
1005
 	private void visitULong() {
1005
 	private void visitULong() {
1006
-		ClassDefinition builtin = new ClassDefinition(BUILTIN, Module.BUILTIN, null, "ulong", Modifiers.EXPORT, null);
1006
+		ClassDefinition builtin = new ClassDefinition(BUILTIN, Module.BUILTIN, null, "ulong", Modifiers.PUBLIC, null);
1007
 		
1007
 		
1008
 		invert(builtin, ULONG_NOT, ULONG);
1008
 		invert(builtin, ULONG_NOT, ULONG);
1009
 		inc(builtin, ULONG_DEC, ULONG);
1009
 		inc(builtin, ULONG_DEC, ULONG);
1075
 	}
1075
 	}
1076
 	
1076
 	
1077
 	private void visitUSize() {
1077
 	private void visitUSize() {
1078
-		ClassDefinition builtin = new ClassDefinition(BUILTIN, Module.BUILTIN, null, "usize", Modifiers.EXPORT, null);
1078
+		ClassDefinition builtin = new ClassDefinition(BUILTIN, Module.BUILTIN, null, "usize", Modifiers.PUBLIC, null);
1079
 		
1079
 		
1080
 		invert(builtin, USIZE_NOT, USIZE);
1080
 		invert(builtin, USIZE_NOT, USIZE);
1081
 		inc(builtin, USIZE_DEC, USIZE);
1081
 		inc(builtin, USIZE_DEC, USIZE);
1152
 	}
1152
 	}
1153
 	
1153
 	
1154
 	private void visitFloat() {
1154
 	private void visitFloat() {
1155
-		ClassDefinition builtin = new ClassDefinition(BUILTIN, Module.BUILTIN, null, "float", Modifiers.EXPORT, null);
1155
+		ClassDefinition builtin = new ClassDefinition(BUILTIN, Module.BUILTIN, null, "float", Modifiers.PUBLIC, null);
1156
 		
1156
 		
1157
 		neg(builtin, FLOAT_NEG, FLOAT);
1157
 		neg(builtin, FLOAT_NEG, FLOAT);
1158
 		inc(builtin, FLOAT_DEC, FLOAT);
1158
 		inc(builtin, FLOAT_DEC, FLOAT);
1197
 	}
1197
 	}
1198
 	
1198
 	
1199
 	private void visitDouble() {
1199
 	private void visitDouble() {
1200
-		ClassDefinition builtin = new ClassDefinition(BUILTIN, Module.BUILTIN, null, "double", Modifiers.EXPORT, null);
1200
+		ClassDefinition builtin = new ClassDefinition(BUILTIN, Module.BUILTIN, null, "double", Modifiers.PUBLIC, null);
1201
 		
1201
 		
1202
 		neg(builtin, DOUBLE_NEG, DOUBLE);
1202
 		neg(builtin, DOUBLE_NEG, DOUBLE);
1203
 		inc(builtin, DOUBLE_DEC, DOUBLE);
1203
 		inc(builtin, DOUBLE_DEC, DOUBLE);
1233
 	}
1233
 	}
1234
 
1234
 
1235
 	private void visitChar() {
1235
 	private void visitChar() {
1236
-		ClassDefinition builtin = new ClassDefinition(BUILTIN, Module.BUILTIN, null, "char", Modifiers.EXPORT, null);
1236
+		ClassDefinition builtin = new ClassDefinition(BUILTIN, Module.BUILTIN, null, "char", Modifiers.PUBLIC, null);
1237
 		
1237
 		
1238
 		add(builtin, CHAR_ADD_INT, INT, CHAR);
1238
 		add(builtin, CHAR_ADD_INT, INT, CHAR);
1239
 		sub(builtin, CHAR_SUB_INT, INT, CHAR);
1239
 		sub(builtin, CHAR_SUB_INT, INT, CHAR);

+ 10
- 1
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaExpressionVisitor.java View File

1821
 	@Override
1821
 	@Override
1822
 	public Void visitGetter(GetterExpression expression) {
1822
 	public Void visitGetter(GetterExpression expression) {
1823
 		expression.target.accept(this);
1823
 		expression.target.accept(this);
1824
-
1824
+		
1825
 		BuiltinID builtin = expression.getter.member.builtin;
1825
 		BuiltinID builtin = expression.getter.member.builtin;
1826
 		if (builtin == null) {
1826
 		if (builtin == null) {
1827
+			if (expression.getter.hasTag(JavaField.class)) {
1828
+				javaWriter.getField(expression.getter.getTag(JavaField.class));
1829
+				return null;
1830
+			}
1827
 			if (!checkAndExecuteMethodInfo(expression.getter, expression.type))
1831
 			if (!checkAndExecuteMethodInfo(expression.getter, expression.type))
1828
 				throw new IllegalStateException("Call target has no method info!");
1832
 				throw new IllegalStateException("Call target has no method info!");
1829
 
1833
 
2285
 	public Void visitStaticGetter(StaticGetterExpression expression) {
2289
 	public Void visitStaticGetter(StaticGetterExpression expression) {
2286
 		BuiltinID builtin = expression.getter.member.builtin;
2290
 		BuiltinID builtin = expression.getter.member.builtin;
2287
 		if (builtin == null) {
2291
 		if (builtin == null) {
2292
+			if (expression.getter.hasTag(JavaField.class)) {
2293
+				javaWriter.getStaticField(expression.getter.getTag(JavaField.class));
2294
+				return null;
2295
+			}
2296
+			
2288
 			if (!checkAndExecuteMethodInfo(expression.getter, expression.type))
2297
 			if (!checkAndExecuteMethodInfo(expression.getter, expression.type))
2289
 				throw new IllegalStateException("Call target has no method info!");
2298
 				throw new IllegalStateException("Call target has no method info!");
2290
 
2299
 

+ 7
- 3
JavaShared/src/main/java/org/openzen/zenscript/javashared/prepare/JavaPrepareClassMethodVisitor.java View File

77
 	
77
 	
78
 	@Override
78
 	@Override
79
 	public Void visitField(FieldMember member) {
79
 	public Void visitField(FieldMember member) {
80
-		member.setTag(JavaField.class, new JavaField(cls, member.name, context.getDescriptor(member.type)));
81
-		if (member.hasAutoGetter())
80
+		JavaField field = new JavaField(cls, member.name, context.getDescriptor(member.type));
81
+		member.setTag(JavaField.class, field);
82
+		if (member.hasAutoGetter()) {
82
 			visitGetter(member.autoGetter);
83
 			visitGetter(member.autoGetter);
83
-		if (member.hasAutoSetter())
84
+			member.autoGetter.setTag(JavaField.class, field);
85
+		}
86
+		if (member.hasAutoSetter()) {
84
 			visitSetter(member.autoSetter);
87
 			visitSetter(member.autoSetter);
88
+		}
85
 		
89
 		
86
 		return null;
90
 		return null;
87
 	}
91
 	}

+ 4
- 6
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaDefinitionVisitor.java View File

37
 import org.openzen.zenscript.javasource.scope.JavaSourceFileScope;
37
 import org.openzen.zenscript.javasource.scope.JavaSourceFileScope;
38
 import org.openzen.zenscript.javasource.scope.JavaSourceStatementScope;
38
 import org.openzen.zenscript.javasource.scope.JavaSourceStatementScope;
39
 import org.openzen.zenscript.javashared.JavaClass;
39
 import org.openzen.zenscript.javashared.JavaClass;
40
+import org.openzen.zenscript.javashared.JavaImplementation;
40
 
41
 
41
 /**
42
 /**
42
  *
43
  *
96
 		List<ImplementationMember> mergedImplementations = new ArrayList<>();
97
 		List<ImplementationMember> mergedImplementations = new ArrayList<>();
97
 		for (IDefinitionMember member : definition.members) {
98
 		for (IDefinitionMember member : definition.members) {
98
 			if (member instanceof ImplementationMember) {
99
 			if (member instanceof ImplementationMember) {
99
-				if (isImplementationMergable((ImplementationMember)member))
100
+				JavaImplementation implementation = ((ImplementationMember) member).getTag(JavaImplementation.class);
101
+				if (implementation.inline)
100
 					mergedImplementations.add((ImplementationMember)member);
102
 					mergedImplementations.add((ImplementationMember)member);
101
 			}
103
 			}
102
 		}
104
 		}
350
 	}
352
 	}
351
 	
353
 	
352
 	private void convertModifiers(int modifiers) {
354
 	private void convertModifiers(int modifiers) {
353
-		if (Modifiers.isExport(modifiers) || Modifiers.isPublic(modifiers))
355
+		if (Modifiers.isPublic(modifiers) || Modifiers.isInternal(modifiers))
354
 			output.append("public ");
356
 			output.append("public ");
355
 		if (Modifiers.isPrivate(modifiers))
357
 		if (Modifiers.isPrivate(modifiers))
356
 			output.append("private ");
358
 			output.append("private ");
364
 			output.append("final ");
366
 			output.append("final ");
365
 	}
367
 	}
366
 	
368
 	
367
-	private boolean isImplementationMergable(ImplementationMember implementation) {
368
-		return true; // TODO: check merging conflicts
369
-	}
370
-	
371
 	private void compileMembers(JavaSourceFileScope scope, HighLevelDefinition definition) {
369
 	private void compileMembers(JavaSourceFileScope scope, HighLevelDefinition definition) {
372
 		if (definition.hasTag(JavaNativeClass.class)) {
370
 		if (definition.hasTag(JavaNativeClass.class)) {
373
 			StoredType[] typeParameters = new StoredType[definition.getNumberOfGenericParameters()];
371
 			StoredType[] typeParameters = new StoredType[definition.getNumberOfGenericParameters()];

+ 3
- 3
Parser/src/main/java/org/openzen/zenscript/parser/ParsedFile.java View File

152
 					case K_PRIVATE:
152
 					case K_PRIVATE:
153
 						modifiers |= Modifiers.PRIVATE;
153
 						modifiers |= Modifiers.PRIVATE;
154
 						break;
154
 						break;
155
-					case K_EXPORT:
156
-						modifiers |= Modifiers.EXPORT;
155
+					case K_INTERNAL:
156
+						modifiers |= Modifiers.INTERNAL;
157
 						break;
157
 						break;
158
 					case K_EXTERN:
158
 					case K_EXTERN:
159
 						modifiers |= Modifiers.EXTERN;
159
 						modifiers |= Modifiers.EXTERN;
299
 				statements.add(statement.compile(statementScope));
299
 				statements.add(statement.compile(statementScope));
300
 			}
300
 			}
301
 			
301
 			
302
-			ScriptBlock block = new ScriptBlock(modulePackage.getPackage(), statements);
302
+			ScriptBlock block = new ScriptBlock(modulePackage.module, modulePackage.getPackage(), statements);
303
 			block.setTag(SourceFile.class, file);
303
 			block.setTag(SourceFile.class, file);
304
 			block.setTag(WhitespacePostComment.class, postComment);
304
 			block.setTag(WhitespacePostComment.class, postComment);
305
 			scripts.add(block);
305
 			scripts.add(block);

+ 2
- 2
Parser/src/main/java/org/openzen/zenscript/parser/member/ParsedDefinitionMember.java View File

40
 		int modifiers = 0;
40
 		int modifiers = 0;
41
 		outer: while (true) {
41
 		outer: while (true) {
42
 			switch (tokens.peek().type) {
42
 			switch (tokens.peek().type) {
43
-				case K_EXPORT:
43
+				case K_INTERNAL:
44
 					tokens.next();
44
 					tokens.next();
45
-					modifiers |= Modifiers.EXPORT;
45
+					modifiers |= Modifiers.INTERNAL;
46
 					break;
46
 					break;
47
 				case K_PUBLIC:
47
 				case K_PUBLIC:
48
 					tokens.next();
48
 					tokens.next();

+ 83
- 0
ScriptingExample/scripts/classes.zs View File

1
+public class myTestClass {
2
+
3
+	var nonFinalInt as int = 10;
4
+	val finalInt as int = 20;
5
+
6
+	static var staticNonFinalInt as int = 10;
7
+
8
+	public this() {
9
+
10
+	}
11
+
12
+	public this(nonfinalInt as int) {
13
+		this.nonFinalInt = nonfinalInt;
14
+		println(nonfinalInt);
15
+	}
16
+
17
+	public test() as string {
18
+		return "TEST";
19
+	}
20
+}
21
+
22
+
23
+
24
+val tt = new myTestClass(666);
25
+println(tt.test());
26
+
27
+public interface myTestInterface {
28
+	test() as string;
29
+}
30
+
31
+
32
+public enum myTestEnum {
33
+	ADD(6),
34
+    SUB(6),
35
+    MUL(7),
36
+    DIV(7),
37
+    MOD(7),
38
+    CAT(6),
39
+    OR(4),
40
+    AND(4),
41
+    XOR(4),
42
+    NEG(8),
43
+    NOT(8),
44
+    INVERT(8),
45
+    CONTAINS(5),
46
+    COMPARE(5),
47
+    ASSIGN(0),
48
+    ADDASSIGN(0),
49
+    SUBASSIGN(0),
50
+    MULASSIGN(0),
51
+    DIVASSIGN(0),
52
+    MODASSIGN(0),
53
+    CATASSIGN(0),
54
+    ORASSIGN(0),
55
+    ANDASSIGN(0),
56
+    XORASSIGN(0),
57
+    ANDAND(3),
58
+    OROR(2),
59
+    TERNARY(1),
60
+    COALESCE(2),
61
+    INCREMENT(8),
62
+    DECREMENT(8),
63
+    MEMBER(9),
64
+    RANGE(9),
65
+    INDEX(9),
66
+    CALL(9),
67
+    CAST(9),
68
+    PRIMARY(10);
69
+
70
+	private val priority as int;
71
+	private val isCommutative as bool;
72
+
73
+	public static val test as int = 10;
74
+
75
+	this(i as int) {
76
+		this(i, false);
77
+	}
78
+
79
+	this(i as int, isCommutative as bool) {
80
+		this.priority = i;
81
+		this.isCommutative = isCommutative;
82
+		}
83
+}

+ 58
- 0
ScriptingExample/scripts/conditionals.zs View File

1
+val ternaryOperation = true ? 100 : 222;
2
+
3
+println(ternaryOperation);
4
+
5
+
6
+
7
+var coalesce_one as string? = null;
8
+var coalesce_tow as string? = "test";
9
+
10
+
11
+var coalesce = coalesce_one ?? coalesce_tow;
12
+
13
+println(coalesce);
14
+
15
+
16
+//if(coalesce == "test123") {
17
+//	println("true");
18
+//}
19
+
20
+if 1 == 1 {
21
+	println("intCompareTrue");
22
+}
23
+
24
+//if(1 == "1") {
25
+//	println("well...");
26
+//}
27
+
28
+
29
+if "1" == 1 {
30
+	println("...");
31
+}
32
+
33
+
34
+//var coco as int? = 10;
35
+//var coal as int? = 1;
36
+//
37
+//println(coal ?? coco);
38
+
39
+
40
+println(".....");
41
+println(true ? "RR" : "TT");
42
+
43
+
44
+println((false && true && true) ? "true" : "false");
45
+println((true && true) ? "true" : "false");
46
+println((true && false) ? "true" : "false");
47
+println((false && false) ? "true" : "false");
48
+
49
+println("---");
50
+
51
+println((false || true) ? "true" : "false");
52
+println((true || true) ? "true" : "false");
53
+println((true || false) ? "true" : "false");
54
+println((false || false) ? "true" : "false");
55
+
56
+println(":::");
57
+
58
+println((1 <= 2) ? "true" : "false");

+ 20
- 0
ScriptingExample/scripts/functions.zs View File

1
+function test() as void {
2
+	println("functions.zs; test1");
3
+}
4
+
5
+
6
+
7
+function test2() as void {
8
+	println("functions.zs; test2");
9
+}
10
+
11
+
12
+test();
13
+test2();
14
+println(test3(1, 3));
15
+
16
+
17
+function test3(a as int, b as int) as int{
18
+	println(a+b);
19
+	return a + b;
20
+}

+ 19
- 0
ScriptingExample/scripts/functions2.zs View File

1
+val outOfScope = 10;
2
+
3
+val fun = (a as int, b as int) as int => a + b * outOfScope;
4
+println(fun(30, 20));
5
+
6
+function apply_fn2(fn as function(value as int, othervalue as int) as int, value as int) as int {
7
+    return fn(value, value);
8
+}
9
+
10
+//function scale(value as int, scale as int) as int {
11
+
12
+//	val fun as function(value as int, othervalue as int) as int = ((v as int) as int => v * scale);
13
+//    return apply(fun, scale);
14
+//}
15
+
16
+apply_fn2(fun, 10);
17
+
18
+//println("Value: " + scale(10, 5));
19
+

+ 1
- 0
ScriptingExample/scripts/functions3.zs View File

1
+function apply2(fn as function(value as int) as int, scale as int) as int {
    return fn(scale);
}

function scale2(value as int, scale as int) as int {
    return apply2(v => v * scale, value);
}

+ 22
- 0
ScriptingExample/scripts/functions_lambdas.zs View File

1
+val outOfScope = 10;
2
+val fun1 = (a as int, b as int) as int => a + b * outOfScope;
3
+val fun2 = (a as int, c as int) as int => 13;
4
+
5
+
6
+
7
+function apply(fn as function(value as int) as int, scale as int) as int {
8
+    return fn(scale);
9
+}
10
+
11
+
12
+println(fun1(30, 20));
13
+println(fun2(30, 20));
14
+
15
+
16
+
17
+
18
+function scale(value as int, scale as int) as int {
19
+    return apply(v => v * scale, value);
20
+}
21
+
22
+println("Value: " + scale(10, 5));

+ 7
- 0
ScriptingExample/scripts/helloworld.zs View File

1
+println("Hello \&copy; world!");
2
+println(5);
3
+println(2 + 5);
4
+println(1 - 2);
5
+println(1 + 3 as long);
6
+
7
+println(<hello world in bracket parser>);

+ 51
- 0
ScriptingExample/scripts/match.zs View File

1
+val test as int = 10;
2
+val tt1 = "tt";
3
+val tt2 = "tt3";
4
+val tt4 = "tt5";
5
+
6
+
7
+println(match 10 {
8
+	1 => "one",
9
+	10 => "yo",
10
+	//tt1 === "tt1" for some compiler issue it takes the variable as string input?
11
+	100 => match tt1 {
12
+		"10" => "t",
13
+		"tt1" => tt1,
14
+		"tt2" => tt1 + tt4,
15
+		default => tt4
16
+	},
17
+	default => tt2
18
+});
19
+
20
+
21
+println(tt1);
22
+
23
+//println(match test {
24
+//	case 1 : "tt",
25
+//	default : "kk"
26
+//});
27
+
28
+
29
+
30
+function myFunc (par1 as int) as void {
31
+
32
+    val v0 = par1 - 1;
33
+	println(match par1 {
34
+		10 => v0,
35
+		default => match(v0) {
36
+			10 => 99,
37
+			default => v0
38
+		}
39
+	});
40
+}
41
+
42
+
43
+myFunc(10);
44
+myFunc(11);
45
+myFunc(12);
46
+
47
+
48
+val t = (a as int) as int => a;
49
+
50
+
51
+println(t(10));

+ 94
- 0
ScriptingExample/scripts/moreHellos.zs View File

1
+println("Hello world!");
2
+println(1 as string);
3
+
4
+
5
+var test = "test";
6
+println(test);
7
+
8
+
9
+test = "testMore";
10
+println(test);
11
+
12
+test = 13;
13
+println(test);
14
+
15
+val test2 = 14;
16
+println(test2);
17
+
18
+
19
+if true 
20
+    println("ifTest");
21
+else
22
+    println("elseTest");
23
+
24
+
25
+if false 
26
+    println("testIf");
27
+else
28
+    println("testElse");
29
+
30
+
31
+if (true) {
32
+
33
+    while :testLable true {
34
+        println("trueee");
35
+        if true
36
+            break testLable;
37
+        else
38
+            println("nobreak");
39
+    }
40
+    
41
+    
42
+    do {
43
+        println("tru"); 
44
+        if(false){
45
+        	println("brea");
46
+            continue;
47
+        }
48
+        else{
49
+            println("");
50
+            break;
51
+        }
52
+    } while true;
53
+}
54
+
55
+var testArray = ["1", "2", "3"];
56
+
57
+for item in testArray {
58
+	println("test");
59
+	println(item);
60
+}
61
+
62
+println("");
63
+
64
+var test3 = [1, 2, 3];
65
+
66
+for item in test3 {
67
+	println(item);
68
+}
69
+
70
+for i, item in ["5", "ttt"] {
71
+	println(item + i);
72
+}
73
+
74
+for i, item in [1, 5, 7] {
75
+	println(item + (i as int));
76
+}
77
+
78
+for myI in 10 .. 20 {
79
+	println(myI);
80
+}
81
+
82
+var lateInit as string;
83
+lateInit = "initialized later";
84
+println(lateInit);
85
+
86
+
87
+
88
+
89
+
90
+/*
91
+catch e as string {
92
+	println("noLuv");
93
+}
94
+*/

+ 2
- 0
ScriptingExample/scripts/statements.zs View File

1
+//while true
2
+//	println("Hello!");

+ 18
- 0
ScriptingExample/scripts/switch.zs View File

1
+val test as int = 10;
2
+
3
+
4
+switch test {
5
+	case 1 : println("yay"); break;
6
+	case 10 : println("yo");
7
+	case 100 : println("y");
8
+	default: println("yup");
9
+}
10
+
11
+
12
+val test2 as string = "hello";
13
+
14
+switch test2 {
15
+	case "bye" : println("hello");
16
+	case "hello" : println("goodbye");
17
+	default: println("hellogoodbye");
18
+}

+ 70
- 0
ScriptingExample/scripts/variants.zs View File

1
+public variant Result<T, E> {
2
+    Ok(T),
3
+    Error(E),
4
+    Other(T, E);
5
+    
6
+    /*public then<R>(fn as function(result as T) as Result<R, E>) as Result<R, E> {
7
+        return match this {
8
+            Ok(result) => fn(result),
9
+            Error(error) => Error(error),
10
+			Other(result, error) => fn(result)
11
+        };
12
+    }*/
13
+    
14
+    //public handle<X>(handler as function(error as E) as Result<T, X>) as Result<T, X> {
15
+    //    return match this {
16
+    //        Ok(result) => Ok(result),
17
+    //        Error(error) => handler(error)
18
+    //    };
19
+    //}
20
+    
21
+    public expect() as T {
22
+        return match this {
23
+            Ok(result) => result,
24
+            Error(error) => panic "expect() called on an error value",
25
+			Other(result, error) => result
26
+        };
27
+    }
28
+    
29
+    public orElse(other as T) as T {
30
+        return match this {
31
+            Ok(result) => result,
32
+            Error(error) => other,
33
+			Other(result, error) => result
34
+        };
35
+    }
36
+    
37
+    public orElse(other as function(error as E) as T) as T {
38
+        return match this {
39
+            Ok(result) => result,
40
+            Error(error) => other(error),
41
+			Other(result, error) => result
42
+        };
43
+    }
44
+}
45
+
46
+
47
+
48
+function makeResult() as Result<string, string>
49
+    => Ok("10");
50
+
51
+
52
+function makeErrResult() as Result<string, string>
53
+    => Error("10");
54
+
55
+
56
+println(makeResult().orElse("Ten"));
57
+println(makeResult().expect());
58
+println(makeErrResult().orElse("Ten"));
59
+
60
+
61
+//CompileException [TYPE_ARGUMENTS_NOT_INFERRABLE] Could not infer generic type parameters [ParsedExpressionFunction.compile, line 75]
62
+//println(makeResult().then(tValue => Result<string, string>.Ok(tValue)).expect());
63
+
64
+//IllegalArgumentException: Cannot retrieve members of undetermined type [TypeMembers.<init>, line 71]
65
+//println(makeResult().then(a => Ok(a)).expect());
66
+//println(makeResult().then(a as string => Ok(a)).expect());
67
+
68
+//CompileException [UNEXPECTED_TOKEN] ) expected [LLparserTokenStream.required, line 97]
69
+//Wants to compile a call to function() instead of creating a lambda
70
+//println(makeResult().then((function (t as string) as Result<string, string>)(t => Ok(t))).expect());

+ 12
- 12
ScriptingExample/src/main/java/org/openzen/zenscript/scriptingexample/GlobalRegistry.java View File

19
 import org.openzen.zenscript.codemodel.definition.ClassDefinition;
19
 import org.openzen.zenscript.codemodel.definition.ClassDefinition;
20
 import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
20
 import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
21
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
21
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
22
-import org.openzen.zenscript.codemodel.expression.GetStaticFieldExpression;
23
-import org.openzen.zenscript.codemodel.member.FieldMember;
22
+import org.openzen.zenscript.codemodel.expression.StaticGetterExpression;
23
+import org.openzen.zenscript.codemodel.member.GetterMember;
24
 import org.openzen.zenscript.codemodel.member.MethodMember;
24
 import org.openzen.zenscript.codemodel.member.MethodMember;
25
-import org.openzen.zenscript.codemodel.member.ref.FieldMemberRef;
25
+import org.openzen.zenscript.codemodel.member.ref.GetterMemberRef;
26
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
26
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
27
 import org.openzen.zenscript.codemodel.partial.PartialMemberGroupExpression;
27
 import org.openzen.zenscript.codemodel.partial.PartialMemberGroupExpression;
28
 import org.openzen.zenscript.codemodel.scope.BaseScope;
28
 import org.openzen.zenscript.codemodel.scope.BaseScope;
54
 		PRINTSTREAM_PRINTLN = new MethodMember(
54
 		PRINTSTREAM_PRINTLN = new MethodMember(
55
 			CodePosition.NATIVE,
55
 			CodePosition.NATIVE,
56
 			PRINTSTREAM,
56
 			PRINTSTREAM,
57
-			Modifiers.EXPORT,
57
+			Modifiers.PUBLIC,
58
 			"println",
58
 			"println",
59
 			new FunctionHeader(BasicTypeID.VOID, new FunctionParameter(StringTypeID.BORROW)),
59
 			new FunctionHeader(BasicTypeID.VOID, new FunctionParameter(StringTypeID.BORROW)),
60
 			null);
60
 			null);
61
 		
61
 		
62
-		SYSTEM_OUT = new FieldMember(
62
+		SYSTEM_OUT = new GetterMember(
63
 			CodePosition.NATIVE,
63
 			CodePosition.NATIVE,
64
 			SYSTEM,
64
 			SYSTEM,
65
-			Modifiers.EXPORT | Modifiers.FINAL,
65
+			Modifiers.PUBLIC | Modifiers.FINAL | Modifiers.STATIC,
66
 			"out",
66
 			"out",
67
-			null,
68
-			DefinitionTypeID.forType(registry, SYSTEM).stored(AutoStorageTag.INSTANCE), null, 0, 0, null);
67
+			DefinitionTypeID.forType(registry, SYSTEM).stored(AutoStorageTag.INSTANCE),
68
+			null);
69
 		
69
 		
70
 		JavaClass jPrintStream = new JavaClass("java.io", "PrintStream", JavaClass.Kind.CLASS);
70
 		JavaClass jPrintStream = new JavaClass("java.io", "PrintStream", JavaClass.Kind.CLASS);
71
 		JavaMethod printstreamPrintln = JavaMethod.getNativeVirtual(jPrintStream, "println", "(Ljava/lang/String;)V");
71
 		JavaMethod printstreamPrintln = JavaMethod.getNativeVirtual(jPrintStream, "println", "(Ljava/lang/String;)V");
111
 	}
111
 	}
112
 	
112
 	
113
 	private final Module MODULE = new Module("scriptingExample");
113
 	private final Module MODULE = new Module("scriptingExample");
114
-	private final ClassDefinition PRINTSTREAM = new ClassDefinition(CodePosition.NATIVE, MODULE, javaIo, "PrintStream", Modifiers.EXPORT);
115
-	private final ClassDefinition SYSTEM = new ClassDefinition(CodePosition.NATIVE, MODULE, javaLang, "System", Modifiers.EXPORT);
114
+	private final ClassDefinition PRINTSTREAM = new ClassDefinition(CodePosition.NATIVE, MODULE, javaIo, "PrintStream", Modifiers.PUBLIC);
115
+	private final ClassDefinition SYSTEM = new ClassDefinition(CodePosition.NATIVE, MODULE, javaLang, "System", Modifiers.PUBLIC);
116
 	private final MethodMember PRINTSTREAM_PRINTLN;
116
 	private final MethodMember PRINTSTREAM_PRINTLN;
117
-	private final FieldMember SYSTEM_OUT;
117
+	private final GetterMember SYSTEM_OUT;
118
 	
118
 	
119
 	private class PrintlnSymbol implements ISymbol {
119
 	private class PrintlnSymbol implements ISymbol {
120
 
120
 
123
 			return new PartialMemberGroupExpression(
123
 			return new PartialMemberGroupExpression(
124
 					position,
124
 					position,
125
 					scope,
125
 					scope,
126
-					new GetStaticFieldExpression(position, new FieldMemberRef(scope.getTypeRegistry().getForMyDefinition(SYSTEM).stored(StaticExpressionStorageTag.INSTANCE), SYSTEM_OUT, GenericMapper.EMPTY)),
126
+					new StaticGetterExpression(position, new GetterMemberRef(scope.getTypeRegistry().getForMyDefinition(SYSTEM).stored(StaticExpressionStorageTag.INSTANCE), SYSTEM_OUT, GenericMapper.EMPTY)),
127
 					"println",
127
 					"println",
128
 					PRINTSTREAM_PRINTLN.ref(scope.getTypeRegistry().getForDefinition(PRINTSTREAM).stored(BorrowStorageTag.INVOCATION), GenericMapper.EMPTY),
128
 					PRINTSTREAM_PRINTLN.ref(scope.getTypeRegistry().getForDefinition(PRINTSTREAM).stored(BorrowStorageTag.INVOCATION), GenericMapper.EMPTY),
129
 					null,
129
 					null,

+ 2
- 1
Validator/src/main/java/org/openzen/zenscript/validator/TypeContext.java View File

20
 	EXPANSION_TARGET_TYPE("expansion target type"),
20
 	EXPANSION_TARGET_TYPE("expansion target type"),
21
 	OPTION_MEMBER_TYPE("option member type"),
21
 	OPTION_MEMBER_TYPE("option member type"),
22
 	CAST_TARGET_TYPE("cast target type"),
22
 	CAST_TARGET_TYPE("cast target type"),
23
-	TYPE_CHECK_TYPE("type check type");
23
+	TYPE_CHECK_TYPE("type check type"),
24
+	CONSTRUCTOR_TYPE("constructed object type");
24
 	
25
 	
25
 	public final String display;
26
 	public final String display;
26
 	
27
 	

+ 4
- 1
Validator/src/main/java/org/openzen/zenscript/validator/ValidationLogEntry.java View File

80
 		INVALID_CASE,
80
 		INVALID_CASE,
81
 		INVALID_STORAGE_CAST,
81
 		INVALID_STORAGE_CAST,
82
 		INVALID_EXPRESSION,
82
 		INVALID_EXPRESSION,
83
-		INVALID_STATEMENT
83
+		INVALID_STATEMENT,
84
+		NO_ACCESS,
85
+		MUST_BE_STATIC,
86
+		MUST_NOT_BE_STATIC
84
 	}
87
 	}
85
 }
88
 }

+ 12
- 1
Validator/src/main/java/org/openzen/zenscript/validator/Validator.java View File

9
 import java.util.Collections;
9
 import java.util.Collections;
10
 import java.util.List;
10
 import java.util.List;
11
 import org.openzen.zencode.shared.CodePosition;
11
 import org.openzen.zencode.shared.CodePosition;
12
+import org.openzen.zenscript.codemodel.AccessScope;
12
 import org.openzen.zenscript.codemodel.FunctionHeader;
13
 import org.openzen.zenscript.codemodel.FunctionHeader;
13
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
14
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
14
 import org.openzen.zenscript.codemodel.ScriptBlock;
15
 import org.openzen.zenscript.codemodel.ScriptBlock;
44
 	}
45
 	}
45
 	
46
 	
46
 	public void validate(ScriptBlock script) {
47
 	public void validate(ScriptBlock script) {
47
-		StatementValidator statementValidator = new StatementValidator(this, new ScriptScope());
48
+		StatementValidator statementValidator = new StatementValidator(this, new ScriptScope(new AccessScope(script.module, null)));
48
 		for (Statement statement : script.statements) {
49
 		for (Statement statement : script.statements) {
49
 			statement.accept(statementValidator);
50
 			statement.accept(statementValidator);
50
 		}
51
 		}
68
 	}
69
 	}
69
 	
70
 	
70
 	private class ScriptScope implements StatementScope {
71
 	private class ScriptScope implements StatementScope {
72
+		private final AccessScope access;
73
+		
74
+		public ScriptScope(AccessScope access) {
75
+			this.access = access;
76
+		}
71
 
77
 
72
 		@Override
78
 		@Override
73
 		public boolean isConstructor() {
79
 		public boolean isConstructor() {
93
 		public HighLevelDefinition getDefinition() {
99
 		public HighLevelDefinition getDefinition() {
94
 			return null;
100
 			return null;
95
 		}
101
 		}
102
+
103
+		@Override
104
+		public AccessScope getAccessScope() {
105
+			return access;
106
+		}
96
 	}
107
 	}
97
 }
108
 }

+ 12
- 9
Validator/src/main/java/org/openzen/zenscript/validator/analysis/ExpressionScope.java View File

5
  */
5
  */
6
 package org.openzen.zenscript.validator.analysis;
6
 package org.openzen.zenscript.validator.analysis;
7
 
7
 
8
+import org.openzen.zenscript.codemodel.AccessScope;
8
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
9
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
9
 import org.openzen.zenscript.codemodel.member.EnumConstantMember;
10
 import org.openzen.zenscript.codemodel.member.EnumConstantMember;
10
 import org.openzen.zenscript.codemodel.member.FieldMember;
11
 import org.openzen.zenscript.codemodel.member.FieldMember;
15
  * @author Hoofdgebruiker
16
  * @author Hoofdgebruiker
16
  */
17
  */
17
 public interface ExpressionScope {
18
 public interface ExpressionScope {
18
-	public boolean isConstructor();
19
+	boolean isConstructor();
19
 	
20
 	
20
-	public boolean isFirstStatement();
21
+	boolean isFirstStatement();
21
 	
22
 	
22
-	public boolean hasThis();
23
+	boolean hasThis();
23
 	
24
 	
24
-	public boolean isFieldInitialized(FieldMember field);
25
+	boolean isFieldInitialized(FieldMember field);
25
 	
26
 	
26
-	public boolean isEnumConstantInitialized(EnumConstantMember member);
27
+	boolean isEnumConstantInitialized(EnumConstantMember member);
27
 	
28
 	
28
-	public boolean isLocalVariableInitialized(VarStatement variable);
29
+	boolean isLocalVariableInitialized(VarStatement variable);
29
 	
30
 	
30
-	public void markConstructorForwarded();
31
+	void markConstructorForwarded();
31
 	
32
 	
32
-	public boolean isStaticInitializer();
33
+	boolean isStaticInitializer();
33
 	
34
 	
34
-	public HighLevelDefinition getDefinition();
35
+	HighLevelDefinition getDefinition();
36
+	
37
+	AccessScope getAccessScope();
35
 }
38
 }

+ 3
- 0
Validator/src/main/java/org/openzen/zenscript/validator/analysis/StatementScope.java View File

5
  */
5
  */
6
 package org.openzen.zenscript.validator.analysis;
6
 package org.openzen.zenscript.validator.analysis;
7
 
7
 
8
+import org.openzen.zenscript.codemodel.AccessScope;
8
 import org.openzen.zenscript.codemodel.FunctionHeader;
9
 import org.openzen.zenscript.codemodel.FunctionHeader;
9
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
10
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
10
 
11
 
22
 	public boolean isStaticInitializer();
23
 	public boolean isStaticInitializer();
23
 	
24
 	
24
 	public HighLevelDefinition getDefinition();
25
 	public HighLevelDefinition getDefinition();
26
+	
27
+	public AccessScope getAccessScope();
25
 }
28
 }

+ 53
- 16
Validator/src/main/java/org/openzen/zenscript/validator/visitors/DefinitionMemberValidator.java View File

9
 import java.util.HashSet;
9
 import java.util.HashSet;
10
 import java.util.List;
10
 import java.util.List;
11
 import java.util.Set;
11
 import java.util.Set;
12
+import org.openzen.zenscript.codemodel.AccessScope;
12
 import org.openzen.zenscript.codemodel.FunctionHeader;
13
 import org.openzen.zenscript.codemodel.FunctionHeader;
13
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
14
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
14
 import org.openzen.zenscript.codemodel.Modifiers;
15
 import org.openzen.zenscript.codemodel.Modifiers;
115
 			}
116
 			}
116
 		}
117
 		}
117
 		constructors.add(member.header);
118
 		constructors.add(member.header);
118
-		ValidationUtils.validateHeader(validator, member.position, member.header);
119
+		ValidationUtils.validateHeader(validator, member.position, member.header, member.getAccessScope());
119
 		
120
 		
120
 		if (member.body == null && !member.isExtern()) {
121
 		if (member.body == null && !member.isExtern()) {
121
 			validator.logError(ValidationLogEntry.Code.BODY_REQUIRED, member.position, "Constructors must have a body");
122
 			validator.logError(ValidationLogEntry.Code.BODY_REQUIRED, member.position, "Constructors must have a body");
122
 			return null;
123
 			return null;
123
 		} else {
124
 		} else {
124
-			StatementValidator statementValidator = new StatementValidator(validator, new ConstructorStatementScope(member.header));
125
+			StatementValidator statementValidator = new StatementValidator(validator, new ConstructorStatementScope(member.header, member.getAccessScope()));
125
 			member.body.accept(statementValidator);
126
 			member.body.accept(statementValidator);
126
 			validateThrow(member, member.header, member.body);
127
 			validateThrow(member, member.header, member.body);
127
 			
128
 			
142
 		if (member.header.thrownType != null)
143
 		if (member.header.thrownType != null)
143
 			validator.logError(ValidationLogEntry.Code.DESTRUCTOR_CANNOT_THROW, member.position, "Destructor cannot throw");
144
 			validator.logError(ValidationLogEntry.Code.DESTRUCTOR_CANNOT_THROW, member.position, "Destructor cannot throw");
144
 		
145
 		
145
-		validateFunctional(member, new MethodStatementScope(member.header));
146
+		validateFunctional(member, new MethodStatementScope(member.header, member.getAccessScope()));
146
 		return null;
147
 		return null;
147
 	}
148
 	}
148
 
149
 
149
 	@Override
150
 	@Override
150
 	public Void visitMethod(MethodMember member) {
151
 	public Void visitMethod(MethodMember member) {
151
 		ValidationUtils.validateIdentifier(validator, member.position, member.name);
152
 		ValidationUtils.validateIdentifier(validator, member.position, member.name);
152
-		ValidationUtils.validateHeader(validator, member.position, member.header);
153
-		validateFunctional(member, new MethodStatementScope(member.header));
153
+		ValidationUtils.validateHeader(validator, member.position, member.header, member.getAccessScope());
154
+		validateFunctional(member, new MethodStatementScope(member.header, member.getAccessScope()));
154
 		return null;
155
 		return null;
155
 	}
156
 	}
156
 
157
 
158
 	public Void visitGetter(GetterMember member) {
159
 	public Void visitGetter(GetterMember member) {
159
 		ValidationUtils.validateIdentifier(validator, member.position, member.name);
160
 		ValidationUtils.validateIdentifier(validator, member.position, member.name);
160
 		new TypeValidator(validator, member.position).validate(TypeContext.GETTER_TYPE, member.type);
161
 		new TypeValidator(validator, member.position).validate(TypeContext.GETTER_TYPE, member.type);
161
-		validateGetter(member, new MethodStatementScope(new FunctionHeader(member.type)));
162
+		validateGetter(member, new MethodStatementScope(new FunctionHeader(member.type), member.getAccessScope()));
162
 		return null;
163
 		return null;
163
 	}
164
 	}
164
 
165
 
166
 	public Void visitSetter(SetterMember member) {
167
 	public Void visitSetter(SetterMember member) {
167
 		ValidationUtils.validateIdentifier(validator, member.position, member.name);
168
 		ValidationUtils.validateIdentifier(validator, member.position, member.name);
168
 		new TypeValidator(validator, member.position).validate(TypeContext.SETTER_TYPE, member.type);
169
 		new TypeValidator(validator, member.position).validate(TypeContext.SETTER_TYPE, member.type);
169
-		validateSetter(member, new MethodStatementScope(new FunctionHeader(BasicTypeID.VOID, member.parameter)));
170
+		validateSetter(member, new MethodStatementScope(new FunctionHeader(BasicTypeID.VOID, member.parameter), member.getAccessScope()));
170
 		return null;
171
 		return null;
171
 	}
172
 	}
172
 	
173
 	
184
 
185
 
185
 	@Override
186
 	@Override
186
 	public Void visitOperator(OperatorMember member) {
187
 	public Void visitOperator(OperatorMember member) {
187
-		ValidationUtils.validateHeader(validator, member.position, member.header);
188
-		validateFunctional(member, new MethodStatementScope(member.header));
188
+		ValidationUtils.validateHeader(validator, member.position, member.header, member.getAccessScope());
189
+		validateFunctional(member, new MethodStatementScope(member.header, member.getAccessScope()));
189
 		return null;
190
 		return null;
190
 	}
191
 	}
191
 
192
 
192
 	@Override
193
 	@Override
193
 	public Void visitCaster(CasterMember member) {
194
 	public Void visitCaster(CasterMember member) {
194
 		new TypeValidator(validator, member.position).validate(TypeContext.CASTER_TYPE, member.toType);
195
 		new TypeValidator(validator, member.position).validate(TypeContext.CASTER_TYPE, member.toType);
195
-		validateFunctional(member, new MethodStatementScope(member.header));
196
+		validateFunctional(member, new MethodStatementScope(member.header, member.getAccessScope()));
196
 		return null;
197
 		return null;
197
 	}
198
 	}
198
 
199
 
202
 		for (StoredType type : member.getLoopVariableTypes())
203
 		for (StoredType type : member.getLoopVariableTypes())
203
 			typeValidator.validate(TypeContext.ITERATOR_TYPE, type);
204
 			typeValidator.validate(TypeContext.ITERATOR_TYPE, type);
204
 		
205
 		
205
-		validateFunctional(member, new MethodStatementScope(new FunctionHeader(scope.getTypeRegistry().getIterator(member.getLoopVariableTypes()).stored(UniqueStorageTag.INSTANCE))));
206
+		validateFunctional(member, new MethodStatementScope(
207
+				new FunctionHeader(scope.getTypeRegistry().getIterator(member.getLoopVariableTypes()).stored(UniqueStorageTag.INSTANCE)),
208
+				member.getAccessScope()));
206
 		return null;
209
 		return null;
207
 	}
210
 	}
208
 
211
 
209
 	@Override
212
 	@Override
210
 	public Void visitCaller(CallerMember member) {
213
 	public Void visitCaller(CallerMember member) {
211
-		ValidationUtils.validateHeader(validator, member.position, member.header);
212
-		validateFunctional(member, new MethodStatementScope(member.header));
214
+		ValidationUtils.validateHeader(validator, member.position, member.header, member.getAccessScope());
215
+		validateFunctional(member, new MethodStatementScope(member.header, member.getAccessScope()));
213
 		return null;
216
 		return null;
214
 	}
217
 	}
215
 
218
 
279
 
282
 
280
 	@Override
283
 	@Override
281
 	public Void visitStaticInitializer(StaticInitializerMember member) {
284
 	public Void visitStaticInitializer(StaticInitializerMember member) {
282
-		member.body.accept(new StatementValidator(validator, new StaticInitializerScope()));
285
+		member.body.accept(new StatementValidator(validator, new StaticInitializerScope(member.getAccessScope())));
283
 		if (member.body.thrownType != null)
286
 		if (member.body.thrownType != null)
284
 			validator.logError(ValidationLogEntry.Code.STATIC_INITIALIZER_CANNOT_THROW, member.position, "Static initializer cannot throw");
287
 			validator.logError(ValidationLogEntry.Code.STATIC_INITIALIZER_CANNOT_THROW, member.position, "Static initializer cannot throw");
285
 		return null;
288
 		return null;
386
 		public HighLevelDefinition getDefinition() {
389
 		public HighLevelDefinition getDefinition() {
387
 			return definition;
390
 			return definition;
388
 		}
391
 		}
392
+
393
+		@Override
394
+		public AccessScope getAccessScope() {
395
+			return field.getAccessScope();
396
+		}
389
 	}
397
 	}
390
 	
398
 	
391
 	private class ConstructorStatementScope implements StatementScope {
399
 	private class ConstructorStatementScope implements StatementScope {
392
 		private final FunctionHeader header;
400
 		private final FunctionHeader header;
401
+		private final AccessScope access;
393
 		
402
 		
394
-		public ConstructorStatementScope(FunctionHeader header) {
403
+		public ConstructorStatementScope(FunctionHeader header, AccessScope access) {
395
 			this.header = header;
404
 			this.header = header;
405
+			this.access = access;
396
 		}
406
 		}
397
 
407
 
398
 		@Override
408
 		@Override
419
 		public HighLevelDefinition getDefinition() {
429
 		public HighLevelDefinition getDefinition() {
420
 			return definition;
430
 			return definition;
421
 		}
431
 		}
432
+
433
+		@Override
434
+		public AccessScope getAccessScope() {
435
+			return access;
436
+		}
422
 	}
437
 	}
423
 	
438
 	
424
 	private class MethodStatementScope implements StatementScope {
439
 	private class MethodStatementScope implements StatementScope {
425
 		private final FunctionHeader header;
440
 		private final FunctionHeader header;
441
+		private final AccessScope access;
426
 		
442
 		
427
-		public MethodStatementScope(FunctionHeader header) {
443
+		public MethodStatementScope(FunctionHeader header, AccessScope access) {
428
 			this.header = header;
444
 			this.header = header;
445
+			this.access = access;
429
 		}
446
 		}
430
 
447
 
431
 		@Override
448
 		@Override
452
 		public HighLevelDefinition getDefinition() {
469
 		public HighLevelDefinition getDefinition() {
453
 			return definition;
470
 			return definition;
454
 		}
471
 		}
472
+
473
+		@Override
474
+		public AccessScope getAccessScope() {
475
+			return access;
476
+		}
455
 	}
477
 	}
456
 	
478
 	
457
 	private class StaticInitializerScope implements StatementScope {
479
 	private class StaticInitializerScope implements StatementScope {
458
 		private final FunctionHeader header = new FunctionHeader(BasicTypeID.VOID);
480
 		private final FunctionHeader header = new FunctionHeader(BasicTypeID.VOID);
481
+		private final AccessScope access;
482
+		
483
+		public StaticInitializerScope(AccessScope access) {
484
+			this.access = access;
485
+		}
459
 		
486
 		
460
 		@Override
487
 		@Override
461
 		public boolean isConstructor() {
488
 		public boolean isConstructor() {
481
 		public HighLevelDefinition getDefinition() {
508
 		public HighLevelDefinition getDefinition() {
482
 			return definition;
509
 			return definition;
483
 		}
510
 		}
511
+
512
+		@Override
513
+		public AccessScope getAccessScope() {
514
+			return access;
515
+		}
484
 	}
516
 	}
485
 	
517
 	
486
 	private class EnumConstantInitializerScope implements ExpressionScope {
518
 	private class EnumConstantInitializerScope implements ExpressionScope {
533
 		public HighLevelDefinition getDefinition() {
565
 		public HighLevelDefinition getDefinition() {
534
 			return definition;
566
 			return definition;
535
 		}
567
 		}
568
+
569
+		@Override
570
+		public AccessScope getAccessScope() {
571
+			return definition.getAccessScope();
572
+		}
536
 	}
573
 	}
537
 }
574
 }

+ 18
- 10
Validator/src/main/java/org/openzen/zenscript/validator/visitors/DefinitionValidator.java View File

9
 import java.util.List;
9
 import java.util.List;
10
 import java.util.Map;
10
 import java.util.Map;
11
 import org.openzen.zencode.shared.CodePosition;
11
 import org.openzen.zencode.shared.CodePosition;
12
+import org.openzen.zenscript.codemodel.AccessScope;
12
 import org.openzen.zenscript.codemodel.FunctionHeader;
13
 import org.openzen.zenscript.codemodel.FunctionHeader;
13
 import org.openzen.zenscript.codemodel.GenericMapper;
14
 import org.openzen.zenscript.codemodel.GenericMapper;
14
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
15
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
53
 		ValidationUtils.validateModifiers(
54
 		ValidationUtils.validateModifiers(
54
 				validator,
55
 				validator,
55
 				definition.modifiers,
56
 				definition.modifiers,
56
-				PUBLIC | EXPORT | PRIVATE | ABSTRACT | STATIC | PROTECTED | VIRTUAL,
57
+				PUBLIC | INTERNAL | PRIVATE | ABSTRACT | STATIC | PROTECTED | VIRTUAL,
57
 				definition.position,
58
 				definition.position,
58
 				"Invalid class modifier");
59
 				"Invalid class modifier");
59
 		ValidationUtils.validateIdentifier(
60
 		ValidationUtils.validateIdentifier(
73
 		ValidationUtils.validateModifiers(
74
 		ValidationUtils.validateModifiers(
74
 				validator,
75
 				validator,
75
 				definition.modifiers,
76
 				definition.modifiers,
76
-				PUBLIC | EXPORT | PROTECTED | PRIVATE,
77
+				PUBLIC | INTERNAL | PROTECTED | PRIVATE,
77
 				definition.position,
78
 				definition.position,
78
 				"Invalid interface modifier");
79
 				"Invalid interface modifier");
79
 		ValidationUtils.validateIdentifier(
80
 		ValidationUtils.validateIdentifier(
90
 		ValidationUtils.validateModifiers(
91
 		ValidationUtils.validateModifiers(
91
 				validator,
92
 				validator,
92
 				definition.modifiers,
93
 				definition.modifiers,
93
-				PUBLIC | EXPORT | PROTECTED | PRIVATE,
94
+				PUBLIC | INTERNAL | PROTECTED | PRIVATE,
94
 				definition.position,
95
 				definition.position,
95
 				"Invalid enum modifier");
96
 				"Invalid enum modifier");
96
 		ValidationUtils.validateIdentifier(
97
 		ValidationUtils.validateIdentifier(
104
 
105
 
105
 	@Override
106
 	@Override
106
 	public Void visitStruct(StructDefinition definition) {
107
 	public Void visitStruct(StructDefinition definition) {
107
-		int validModifiers = PUBLIC | EXPORT | PROTECTED | PRIVATE;
108
+		int validModifiers = PUBLIC | INTERNAL | PROTECTED | PRIVATE;
108
 		if (definition.outerDefinition != null)
109
 		if (definition.outerDefinition != null)
109
 			validModifiers |= STATIC;
110
 			validModifiers |= STATIC;
110
 		
111
 		
128
 		ValidationUtils.validateModifiers(
129
 		ValidationUtils.validateModifiers(
129
 				validator,
130
 				validator,
130
 				definition.modifiers,
131
 				definition.modifiers,
131
-				PUBLIC | EXPORT | PROTECTED | PRIVATE,
132
+				PUBLIC | INTERNAL | PROTECTED | PRIVATE,
132
 				definition.position,
133
 				definition.position,
133
 				"Invalid function modifier");
134
 				"Invalid function modifier");
134
 		ValidationUtils.validateIdentifier(
135
 		ValidationUtils.validateIdentifier(
136
 				definition.position,
137
 				definition.position,
137
 				definition.name);
138
 				definition.name);
138
 				
139
 				
139
-		StatementValidator statementValidator = new StatementValidator(validator, new FunctionStatementScope(definition.header));
140
+		StatementValidator statementValidator = new StatementValidator(validator, new FunctionStatementScope(definition.header, definition.getAccessScope()));
140
 		definition.caller.body.accept(statementValidator);
141
 		definition.caller.body.accept(statementValidator);
141
 		return null;
142
 		return null;
142
 	}
143
 	}
146
 		ValidationUtils.validateModifiers(
147
 		ValidationUtils.validateModifiers(
147
 				validator,
148
 				validator,
148
 				definition.modifiers,
149
 				definition.modifiers,
149
-				PUBLIC | EXPORT | PROTECTED | PRIVATE,
150
+				PUBLIC | INTERNAL | PROTECTED | PRIVATE,
150
 				definition.position,
151
 				definition.position,
151
 				"Invalid expansion modifier");
152
 				"Invalid expansion modifier");
152
 		
153
 		
160
 		ValidationUtils.validateModifiers(
161
 		ValidationUtils.validateModifiers(
161
 				validator,
162
 				validator,
162
 				definition.modifiers,
163
 				definition.modifiers,
163
-				PUBLIC | EXPORT | PROTECTED | PRIVATE,
164
+				PUBLIC | INTERNAL | PROTECTED | PRIVATE,
164
 				definition.position,
165
 				definition.position,
165
 				"Invalid alias modifier");
166
 				"Invalid alias modifier");
166
 		ValidationUtils.validateIdentifier(
167
 		ValidationUtils.validateIdentifier(
189
 		ValidationUtils.validateModifiers(
190
 		ValidationUtils.validateModifiers(
190
 				validator,
191
 				validator,
191
 				variant.modifiers,
192
 				variant.modifiers,
192
-				PUBLIC | EXPORT | PROTECTED | PRIVATE,
193
+				PUBLIC | INTERNAL | PROTECTED | PRIVATE,
193
 				variant.position,
194
 				variant.position,
194
 				"Invalid variant modifier");
195
 				"Invalid variant modifier");
195
 		ValidationUtils.validateIdentifier(
196
 		ValidationUtils.validateIdentifier(
260
 	
261
 	
261
 	private class FunctionStatementScope implements StatementScope {
262
 	private class FunctionStatementScope implements StatementScope {
262
 		private final FunctionHeader header;
263
 		private final FunctionHeader header;
264
+		private final AccessScope access;
263
 		
265
 		
264
-		public FunctionStatementScope(FunctionHeader header) {
266
+		public FunctionStatementScope(FunctionHeader header, AccessScope access) {
265
 			this.header = header;
267
 			this.header = header;
268
+			this.access = access;
266
 		}
269
 		}
267
 
270
 
268
 		@Override
271
 		@Override
289
 		public HighLevelDefinition getDefinition() {
292
 		public HighLevelDefinition getDefinition() {
290
 			return null;
293
 			return null;
291
 		}
294
 		}
295
+
296
+		@Override
297
+		public AccessScope getAccessScope() {
298
+			return access;
299
+		}
292
 	}
300
 	}
293
 }
301
 }

+ 61
- 0
Validator/src/main/java/org/openzen/zenscript/validator/visitors/ExpressionValidator.java View File

10
 import org.openzen.zencode.shared.CodePosition;
10
 import org.openzen.zencode.shared.CodePosition;
11
 import org.openzen.zenscript.codemodel.FunctionHeader;
11
 import org.openzen.zenscript.codemodel.FunctionHeader;
12
 import org.openzen.zenscript.codemodel.FunctionParameter;
12
 import org.openzen.zenscript.codemodel.FunctionParameter;
13
+import org.openzen.zenscript.codemodel.Modifiers;
13
 import org.openzen.zenscript.codemodel.definition.EnumDefinition;
14
 import org.openzen.zenscript.codemodel.definition.EnumDefinition;
14
 import org.openzen.zenscript.codemodel.definition.VariantDefinition;
15
 import org.openzen.zenscript.codemodel.definition.VariantDefinition;
15
 import org.openzen.zenscript.codemodel.expression.*;
16
 import org.openzen.zenscript.codemodel.expression.*;
16
 import org.openzen.zenscript.codemodel.expression.switchvalue.EnumConstantSwitchValue;
17
 import org.openzen.zenscript.codemodel.expression.switchvalue.EnumConstantSwitchValue;
17
 import org.openzen.zenscript.codemodel.expression.switchvalue.VariantOptionSwitchValue;
18
 import org.openzen.zenscript.codemodel.expression.switchvalue.VariantOptionSwitchValue;
18
 import org.openzen.zenscript.codemodel.member.EnumConstantMember;
19
 import org.openzen.zenscript.codemodel.member.EnumConstantMember;
20
+import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
21
+import org.openzen.zenscript.codemodel.member.ref.FieldMemberRef;
19
 import org.openzen.zenscript.codemodel.type.ArrayTypeID;
22
 import org.openzen.zenscript.codemodel.type.ArrayTypeID;
20
 import org.openzen.zenscript.codemodel.type.AssocTypeID;
23
 import org.openzen.zenscript.codemodel.type.AssocTypeID;
21
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
24
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
79
 		if (!expression.right.type.equals(expression.operator.getHeader().parameters[0].type))
82
 		if (!expression.right.type.equals(expression.operator.getHeader().parameters[0].type))
80
 			validator.logError(ValidationLogEntry.Code.INVALID_OPERAND_TYPE, expression.position, "comparison has invalid right type!");
83
 			validator.logError(ValidationLogEntry.Code.INVALID_OPERAND_TYPE, expression.position, "comparison has invalid right type!");
81
 		
84
 		
85
+		checkMemberAccess(expression.position, expression.operator);
86
+		checkNotStatic(expression.position, expression.operator);
87
+		
82
 		expression.left.accept(this);
88
 		expression.left.accept(this);
83
 		expression.right.accept(this);
89
 		expression.right.accept(this);
84
 		return null;
90
 		return null;
87
 	@Override
93
 	@Override
88
 	public Void visitCall(CallExpression expression) {
94
 	public Void visitCall(CallExpression expression) {
89
 		expression.target.accept(this);
95
 		expression.target.accept(this);
96
+		
97
+		checkMemberAccess(expression.position, expression.member);
90
 		checkCallArguments(expression.position, expression.member.getHeader(), expression.instancedHeader, expression.arguments);
98
 		checkCallArguments(expression.position, expression.member.getHeader(), expression.instancedHeader, expression.arguments);
99
+		checkNotStatic(expression.position, expression.member);
91
 		return null;
100
 		return null;
92
 	}
101
 	}
93
 
102
 
94
 	@Override
103
 	@Override
95
 	public Void visitCallStatic(CallStaticExpression expression) {
104
 	public Void visitCallStatic(CallStaticExpression expression) {
105
+		checkMemberAccess(expression.position, expression.member);
96
 		checkCallArguments(expression.position, expression.member.getHeader(), expression.instancedHeader, expression.arguments);
106
 		checkCallArguments(expression.position, expression.member.getHeader(), expression.instancedHeader, expression.arguments);
107
+		checkStatic(expression.position, expression.member);
97
 		return null;
108
 		return null;
98
 	}
109
 	}
99
 	
110
 	
100
 	@Override
111
 	@Override
101
 	public Void visitConst(ConstExpression expression) {
112
 	public Void visitConst(ConstExpression expression) {
113
+		checkMemberAccess(expression.position, expression.constant);
102
 		return null;
114
 		return null;
103
 	}
115
 	}
104
 
116
 
129
 
141
 
130
 	@Override
142
 	@Override
131
 	public Void visitCast(CastExpression expression) {
143
 	public Void visitCast(CastExpression expression) {
144
+		checkMemberAccess(expression.position, expression.member);
132
 		return expression.target.accept(this);
145
 		return expression.target.accept(this);
133
 	}
146
 	}
134
 
147
 
247
 
260
 
248
 	@Override
261
 	@Override
249
 	public Void visitConstructorSuperCall(ConstructorSuperCallExpression expression) {
262
 	public Void visitConstructorSuperCall(ConstructorSuperCallExpression expression) {
263
+		checkMemberAccess(expression.position, expression.constructor);
264
+		
250
 		if (!scope.isConstructor()) {
265
 		if (!scope.isConstructor()) {
251
 			validator.logError(ValidationLogEntry.Code.CONSTRUCTOR_FORWARD_OUTSIDE_CONSTRUCTOR, expression.position, "Can only forward constructors inside constructors");
266
 			validator.logError(ValidationLogEntry.Code.CONSTRUCTOR_FORWARD_OUTSIDE_CONSTRUCTOR, expression.position, "Can only forward constructors inside constructors");
252
 		}
267
 		}
277
 
292
 
278
 	@Override
293
 	@Override
279
 	public Void visitGetField(GetFieldExpression expression) {
294
 	public Void visitGetField(GetFieldExpression expression) {
295
+		checkFieldAccess(expression.position, expression.field);
296
+		checkNotStatic(expression.position, expression.field);
297
+		
280
 		expression.target.accept(this);
298
 		expression.target.accept(this);
281
 		if (expression.target instanceof ThisExpression && !scope.isFieldInitialized(expression.field.member)) {
299
 		if (expression.target instanceof ThisExpression && !scope.isFieldInitialized(expression.field.member)) {
282
 			validator.logError(
300
 			validator.logError(
310
 
328
 
311
 	@Override
329
 	@Override
312
 	public Void visitGetStaticField(GetStaticFieldExpression expression) {
330
 	public Void visitGetStaticField(GetStaticFieldExpression expression) {
331
+		checkFieldAccess(expression.position, expression.field);
332
+		checkStatic(expression.position, expression.field);
313
 		return null;
333
 		return null;
314
 	}
334
 	}
315
 
335
 
316
 	@Override
336
 	@Override
317
 	public Void visitGetter(GetterExpression expression) {
337
 	public Void visitGetter(GetterExpression expression) {
338
+		checkMemberAccess(expression.position, expression.getter);
339
+		checkStatic(expression.position, expression.getter);
318
 		return expression.target.accept(this);
340
 		return expression.target.accept(this);
319
 	}
341
 	}
320
 	
342
 	
450
 
472
 
451
 	@Override
473
 	@Override
452
 	public Void visitNew(NewExpression expression) {
474
 	public Void visitNew(NewExpression expression) {
475
+		new TypeValidator(validator, expression.position).validate(TypeContext.CONSTRUCTOR_TYPE, expression.constructor.getOwnerType().type);
476
+		checkMemberAccess(expression.position, expression.constructor);
453
 		checkCallArguments(
477
 		checkCallArguments(
454
 				expression.position,
478
 				expression.position,
455
 				expression.constructor.getHeader(),
479
 				expression.constructor.getHeader(),
487
 	
511
 	
488
 	@Override
512
 	@Override
489
 	public Void visitPostCall(PostCallExpression expression) {
513
 	public Void visitPostCall(PostCallExpression expression) {
514
+		checkMemberAccess(expression.position, expression.member);
515
+		checkNotStatic(expression.position, expression.member);
516
+		
490
 		expression.target.accept(this);
517
 		expression.target.accept(this);
491
 		// TODO: is target a valid increment target?
518
 		// TODO: is target a valid increment target?
492
 		return null;
519
 		return null;
516
 
543
 
517
 	@Override
544
 	@Override
518
 	public Void visitSetField(SetFieldExpression expression) {
545
 	public Void visitSetField(SetFieldExpression expression) {
546
+		checkFieldAccess(expression.position, expression.field);
547
+		checkNotStatic(expression.position, expression.field);
548
+		
519
 		expression.target.accept(this);
549
 		expression.target.accept(this);
520
 		expression.value.accept(this);
550
 		expression.value.accept(this);
521
 		if (!expression.value.type.equals(expression.field.getType())) {
551
 		if (!expression.value.type.equals(expression.field.getType())) {
561
 
591
 
562
 	@Override
592
 	@Override
563
 	public Void visitSetStaticField(SetStaticFieldExpression expression) {
593
 	public Void visitSetStaticField(SetStaticFieldExpression expression) {
594
+		checkFieldAccess(expression.position, expression.field);
595
+		checkStatic(expression.position, expression.field);
596
+		
564
 		expression.value.accept(this);
597
 		expression.value.accept(this);
565
 		if (!expression.value.type.equals(expression.field.getType())) {
598
 		if (!expression.value.type.equals(expression.field.getType())) {
566
 			validator.logError(
599
 			validator.logError(
581
 
614
 
582
 	@Override
615
 	@Override
583
 	public Void visitSetter(SetterExpression expression) {
616
 	public Void visitSetter(SetterExpression expression) {
617
+		checkMemberAccess(expression.position, expression.setter);
618
+		checkNotStatic(expression.position, expression.setter);
619
+		
584
 		expression.target.accept(this);
620
 		expression.target.accept(this);
585
 		expression.value.accept(this);
621
 		expression.value.accept(this);
586
 		if (!expression.value.type.equals(expression.setter.getType())) {
622
 		if (!expression.value.type.equals(expression.setter.getType())) {
594
 
630
 
595
 	@Override
631
 	@Override
596
 	public Void visitStaticGetter(StaticGetterExpression expression) {
632
 	public Void visitStaticGetter(StaticGetterExpression expression) {
633
+		checkMemberAccess(expression.position, expression.getter);
634
+		checkStatic(expression.position, expression.getter);
597
 		return null;
635
 		return null;
598
 	}
636
 	}
599
 
637
 
600
 	@Override
638
 	@Override
601
 	public Void visitStaticSetter(StaticSetterExpression expression) {
639
 	public Void visitStaticSetter(StaticSetterExpression expression) {
640
+		checkMemberAccess(expression.position, expression.setter);
641
+		checkStatic(expression.position, expression.setter);
642
+		
602
 		expression.value.accept(this);
643
 		expression.value.accept(this);
603
 		if (!expression.value.type.equals(expression.setter.getType())) {
644
 		if (!expression.value.type.equals(expression.setter.getType())) {
604
 			validator.logError(
645
 			validator.logError(
683
 		return null;
724
 		return null;
684
 	}
725
 	}
685
 	
726
 	
727
+	private void checkMemberAccess(CodePosition position, DefinitionMemberRef member) {
728
+		if (!scope.getAccessScope().hasAccessTo(member.getTarget().getAccessScope(), member.getTarget().getModifiers()))
729
+			validator.logError(ValidationLogEntry.Code.NO_ACCESS, position, "no access to " + member.describe());
730
+	}
731
+
732
+	private void checkFieldAccess(CodePosition position, FieldMemberRef field) {
733
+		if (!scope.getAccessScope().equals(field.getTarget().getAccessScope()))
734
+			validator.logError(ValidationLogEntry.Code.NO_ACCESS, position, "fields are private");
735
+	}
736
+	
737
+	private void checkStatic(CodePosition position, DefinitionMemberRef member) {
738
+		if (!Modifiers.isStatic(member.getTarget().getModifiers()))
739
+			validator.logError(ValidationLogEntry.Code.MUST_BE_STATIC, position, "Member is not static");
740
+	}
741
+	
742
+	private void checkNotStatic(CodePosition position, DefinitionMemberRef member) {
743
+		if (Modifiers.isStatic(member.getTarget().getModifiers()))
744
+			validator.logError(ValidationLogEntry.Code.MUST_NOT_BE_STATIC, position, "Member must not be static");
745
+	}
746
+	
686
 	private void checkCallArguments(CodePosition position, FunctionHeader originalHeader, FunctionHeader instancedHeader, CallArguments arguments) {
747
 	private void checkCallArguments(CodePosition position, FunctionHeader originalHeader, FunctionHeader instancedHeader, CallArguments arguments) {
687
 		ValidationUtils.validateTypeArguments(validator, position, originalHeader.typeParameters, arguments.typeArguments);
748
 		ValidationUtils.validateTypeArguments(validator, position, originalHeader.typeParameters, arguments.typeArguments);
688
 		
749
 		

+ 6
- 0
Validator/src/main/java/org/openzen/zenscript/validator/visitors/StatementValidator.java View File

7
 
7
 
8
 import java.util.HashSet;
8
 import java.util.HashSet;
9
 import java.util.Set;
9
 import java.util.Set;
10
+import org.openzen.zenscript.codemodel.AccessScope;
10
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
11
 import org.openzen.zenscript.codemodel.expression.Expression;
12
 import org.openzen.zenscript.codemodel.expression.Expression;
12
 import org.openzen.zenscript.codemodel.member.EnumConstantMember;
13
 import org.openzen.zenscript.codemodel.member.EnumConstantMember;
303
 		public HighLevelDefinition getDefinition() {
304
 		public HighLevelDefinition getDefinition() {
304
 			return scope.getDefinition();
305
 			return scope.getDefinition();
305
 		}
306
 		}
307
+
308
+		@Override
309
+		public AccessScope getAccessScope() {
310
+			return scope.getAccessScope();
311
+		}
306
 	}
312
 	}
307
 }
313
 }

+ 2
- 1
Validator/src/main/java/org/openzen/zenscript/validator/visitors/TypeValidator.java View File

6
 package org.openzen.zenscript.validator.visitors;
6
 package org.openzen.zenscript.validator.visitors;
7
 
7
 
8
 import org.openzen.zencode.shared.CodePosition;
8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.AccessScope;
9
 import org.openzen.zenscript.codemodel.type.ArrayTypeID;
10
 import org.openzen.zenscript.codemodel.type.ArrayTypeID;
10
 import org.openzen.zenscript.codemodel.type.AssocTypeID;
11
 import org.openzen.zenscript.codemodel.type.AssocTypeID;
11
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
12
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
102
 
103
 
103
 	@Override
104
 	@Override
104
 	public Void visitFunction(TypeContext context, FunctionTypeID function) {
105
 	public Void visitFunction(TypeContext context, FunctionTypeID function) {
105
-		ValidationUtils.validateHeader(validator, position, function.header);
106
+		ValidationUtils.validateHeader(validator, position, function.header, new AccessScope(null, null));
106
 		return null;
107
 		return null;
107
 	}
108
 	}
108
 
109
 

+ 21
- 10
Validator/src/main/java/org/openzen/zenscript/validator/visitors/ValidationUtils.java View File

9
 import java.util.Set;
9
 import java.util.Set;
10
 import java.util.regex.Pattern;
10
 import java.util.regex.Pattern;
11
 import org.openzen.zencode.shared.CodePosition;
11
 import org.openzen.zencode.shared.CodePosition;
12
+import org.openzen.zenscript.codemodel.AccessScope;
12
 import org.openzen.zenscript.codemodel.FunctionHeader;
13
 import org.openzen.zenscript.codemodel.FunctionHeader;
13
 import org.openzen.zenscript.codemodel.FunctionParameter;
14
 import org.openzen.zenscript.codemodel.FunctionParameter;
14
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
15
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
52
 		}
53
 		}
53
 	}
54
 	}
54
 	
55
 	
55
-	public static void validateHeader(Validator target, CodePosition position, FunctionHeader header) {
56
+	public static void validateHeader(Validator target, CodePosition position, FunctionHeader header, AccessScope access) {
56
 		TypeValidator typeValidator = new TypeValidator(target, position);
57
 		TypeValidator typeValidator = new TypeValidator(target, position);
57
 		typeValidator.validate(TypeContext.RETURN_TYPE, header.getReturnType());
58
 		typeValidator.validate(TypeContext.RETURN_TYPE, header.getReturnType());
58
 		
59
 		
72
 			typeValidator.validate(TypeContext.PARAMETER_TYPE, parameter.type);
73
 			typeValidator.validate(TypeContext.PARAMETER_TYPE, parameter.type);
73
 			
74
 			
74
 			if (parameter.defaultValue != null) {
75
 			if (parameter.defaultValue != null) {
75
-				parameter.defaultValue.accept(new ExpressionValidator(target, new DefaultParameterValueExpressionScope()));
76
+				parameter.defaultValue.accept(new ExpressionValidator(target, new DefaultParameterValueExpressionScope(access)));
76
 				if (parameter.defaultValue.type != parameter.type) {
77
 				if (parameter.defaultValue.type != parameter.type) {
77
 					target.logError(INVALID_TYPE, position, "default value does not match parameter type");
78
 					target.logError(INVALID_TYPE, position, "default value does not match parameter type");
78
 				}
79
 				}
97
 			CodePosition position,
98
 			CodePosition position,
98
 			String error)
99
 			String error)
99
 	{
100
 	{
100
-		if (Modifiers.isPublic(modifiers) && Modifiers.isExport(modifiers))
101
-			target.logError(INVALID_MODIFIER, position, error + ": cannot combine public and export");
101
+		if (Modifiers.isPublic(modifiers) && Modifiers.isInternal(modifiers))
102
+			target.logError(INVALID_MODIFIER, position, error + ": cannot combine public and internal");
102
 		if (Modifiers.isPublic(modifiers) && Modifiers.isPrivate(modifiers))
103
 		if (Modifiers.isPublic(modifiers) && Modifiers.isPrivate(modifiers))
103
 			target.logError(INVALID_MODIFIER, position, error + ": cannot combine public and private");
104
 			target.logError(INVALID_MODIFIER, position, error + ": cannot combine public and private");
104
 		if (Modifiers.isPublic(modifiers) && Modifiers.isProtected(modifiers))
105
 		if (Modifiers.isPublic(modifiers) && Modifiers.isProtected(modifiers))
105
 			target.logError(INVALID_MODIFIER, position, error + ": cannot combine public and protected");
106
 			target.logError(INVALID_MODIFIER, position, error + ": cannot combine public and protected");
106
-		if (Modifiers.isExport(modifiers) && Modifiers.isPrivate(modifiers))
107
-			target.logError(INVALID_MODIFIER, position, error + ": cannot combine export and private");
108
-		if (Modifiers.isExport(modifiers) && Modifiers.isProtected(modifiers))
109
-			target.logError(INVALID_MODIFIER, position, error + ": cannot combine export and protected");
107
+		if (Modifiers.isInternal(modifiers) && Modifiers.isPrivate(modifiers))
108
+			target.logError(INVALID_MODIFIER, position, error + ": cannot combine internal and private");
109
+		if (Modifiers.isInternal(modifiers) && Modifiers.isProtected(modifiers))
110
+			target.logError(INVALID_MODIFIER, position, error + ": cannot combine internal and protected");
110
 		if (Modifiers.isPrivate(modifiers) && Modifiers.isProtected(modifiers))
111
 		if (Modifiers.isPrivate(modifiers) && Modifiers.isProtected(modifiers))
111
 			target.logError(INVALID_MODIFIER, position, error + ": cannot combine private and protected");
112
 			target.logError(INVALID_MODIFIER, position, error + ": cannot combine private and protected");
112
 		
113
 		
123
 		
124
 		
124
 		if (Modifiers.isPublic(invalid))
125
 		if (Modifiers.isPublic(invalid))
125
 			target.logError(INVALID_MODIFIER, position, error + ": public");
126
 			target.logError(INVALID_MODIFIER, position, error + ": public");
126
-		if (Modifiers.isExport(invalid))
127
-			target.logError(INVALID_MODIFIER, position, error + ": export");
127
+		if (Modifiers.isInternal(invalid))
128
+			target.logError(INVALID_MODIFIER, position, error + ": internal");
128
 		if (Modifiers.isProtected(invalid))
129
 		if (Modifiers.isProtected(invalid))
129
 			target.logError(INVALID_MODIFIER, position, error + ": protected");
130
 			target.logError(INVALID_MODIFIER, position, error + ": protected");
130
 		if (Modifiers.isPrivate(invalid))
131
 		if (Modifiers.isPrivate(invalid))
220
 	}
221
 	}
221
 	
222
 	
222
 	private static class DefaultParameterValueExpressionScope implements ExpressionScope {
223
 	private static class DefaultParameterValueExpressionScope implements ExpressionScope {
224
+		private final AccessScope access;
225
+		
226
+		public DefaultParameterValueExpressionScope(AccessScope access) {
227
+			this.access = access;
228
+		}
223
 		
229
 		
224
 		@Override
230
 		@Override
225
 		public boolean isConstructor() {
231
 		public boolean isConstructor() {
265
 		public HighLevelDefinition getDefinition() {
271
 		public HighLevelDefinition getDefinition() {
266
 			return null;
272
 			return null;
267
 		}
273
 		}
274
+
275
+		@Override
276
+		public AccessScope getAccessScope() {
277
+			return access;
278
+		}
268
 	}
279
 	}
269
 }
280
 }

Loading…
Cancel
Save