Bladeren bron

- Added access & static checks to validator

- Removed export access and added internal access support
Stan Hebben 6 jaren geleden
bovenliggende
commit
4ada6df10e
44 gewijzigde bestanden met toevoegingen van 818 en 107 verwijderingen
  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 Bestand weergeven

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

+ 56
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/AccessScope.java Bestand weergeven

@@ -0,0 +1,56 @@
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 Bestand weergeven

@@ -27,6 +27,7 @@ import org.openzen.zenscript.codemodel.member.IDefinitionMember;
27 27
 import org.openzen.zenscript.codemodel.member.ImplementationMember;
28 28
 import org.openzen.zenscript.codemodel.member.InnerDefinitionMember;
29 29
 import org.openzen.zenscript.codemodel.scope.TypeScope;
30
+import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
30 31
 import org.openzen.zenscript.codemodel.type.TypeID;
31 32
 
32 33
 /**
@@ -84,6 +85,16 @@ public abstract class HighLevelDefinition extends Taggable {
84 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 98
 	public int getNumberOfGenericParameters() {
88 99
 		return typeParameters == null ? 0 : typeParameters.length;
89 100
 	}
@@ -146,6 +157,10 @@ public abstract class HighLevelDefinition extends Taggable {
146 157
 		this.typeParameters = typeParameters;
147 158
 	}
148 159
 	
160
+	public AccessScope getAccessScope() {
161
+		return new AccessScope(module, this);
162
+	}
163
+	
149 164
 	public List<FieldMember> getFields() {
150 165
 		List<FieldMember> fields = new ArrayList<>();
151 166
 		for (IDefinitionMember member : members)

+ 7
- 3
CodeModel/src/main/java/org/openzen/zenscript/codemodel/Modifiers.java Bestand weergeven

@@ -13,7 +13,7 @@ public class Modifiers {
13 13
 	private Modifiers() {}
14 14
 	
15 15
 	public static final int PUBLIC = 1;
16
-	public static final int EXPORT = 2;
16
+	public static final int INTERNAL = 2;
17 17
 	public static final int PRIVATE = 4;
18 18
 	public static final int ABSTRACT = 8;
19 19
 	public static final int FINAL = 16;
@@ -30,8 +30,8 @@ public class Modifiers {
30 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 37
 	public static boolean isProtected(int modifiers) {
@@ -77,4 +77,8 @@ public class Modifiers {
77 77
 	public static boolean isOverride(int modifiers) {
78 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 Bestand weergeven

@@ -19,16 +19,18 @@ import org.openzen.zenscript.codemodel.statement.Statement;
19 19
  * @author Hoofdgebruiker
20 20
  */
21 21
 public class ScriptBlock extends Taggable {
22
+	public final Module module;
22 23
 	public final ZSPackage pkg;
23 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 28
 		this.pkg = pkg;
27 29
 		this.statements = statements;
28 30
 	}
29 31
 	
30 32
 	public ScriptBlock withStatements(List<Statement> newStatements) {
31
-		ScriptBlock result = new ScriptBlock(pkg, newStatements);
33
+		ScriptBlock result = new ScriptBlock(module, pkg, newStatements);
32 34
 		result.addAllTagsFrom(this);
33 35
 		return result;
34 36
 	}
@@ -38,7 +40,7 @@ public class ScriptBlock extends Taggable {
38 40
 		for (Statement statement : statements) {
39 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 44
 		result.addAllTagsFrom(this);
43 45
 		return result;
44 46
 	}

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/definition/FunctionDefinition.java Bestand weergeven

@@ -40,7 +40,7 @@ public class FunctionDefinition extends HighLevelDefinition {
40 40
 	
41 41
 	public void setHeader(GlobalTypeRegistry registry, FunctionHeader header) {
42 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 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 Bestand weergeven

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

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

@@ -97,6 +97,8 @@ public class ConstructorMember extends FunctionalMember {
97 97
 	public void normalize(TypeScope scope) {
98 98
 		if (definition instanceof EnumDefinition)
99 99
 			modifiers |= Modifiers.PRIVATE;
100
+		else if (!Modifiers.hasAccess(modifiers))
101
+			modifiers |= Modifiers.INTERNAL;
100 102
 		
101 103
 		super.normalize(scope);
102 104
 	}

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

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

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

@@ -10,6 +10,7 @@ import org.openzen.zencode.shared.ConcatMap;
10 10
 import org.openzen.zenscript.codemodel.FunctionHeader;
11 11
 import org.openzen.zenscript.codemodel.GenericMapper;
12 12
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
13
+import org.openzen.zenscript.codemodel.Modifiers;
13 14
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
14 15
 import org.openzen.zenscript.codemodel.member.ref.GetterMemberRef;
15 16
 import org.openzen.zenscript.codemodel.scope.TypeScope;
@@ -81,6 +82,8 @@ public class GetterMember extends PropertyMember {
81 82
 
82 83
 	@Override
83 84
 	public void normalize(TypeScope scope) {
85
+		if (!Modifiers.hasAccess(modifiers))
86
+			modifiers |= Modifiers.INTERNAL;
84 87
 		if (body != null)
85 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 Bestand weergeven

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.codemodel.member;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.AccessScope;
9 10
 import org.openzen.zenscript.codemodel.FunctionHeader;
10 11
 import org.openzen.zenscript.codemodel.GenericMapper;
11 12
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
@@ -55,4 +56,8 @@ public interface IDefinitionMember {
55 56
 	DefinitionMemberRef ref(StoredType type, GenericMapper mapper);
56 57
 	
57 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 Bestand weergeven

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

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

@@ -11,6 +11,7 @@ import org.openzen.zenscript.codemodel.FunctionHeader;
11 11
 import org.openzen.zenscript.codemodel.FunctionParameter;
12 12
 import org.openzen.zenscript.codemodel.GenericMapper;
13 13
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
14
+import org.openzen.zenscript.codemodel.Modifiers;
14 15
 import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
15 16
 import org.openzen.zenscript.codemodel.member.ref.SetterMemberRef;
16 17
 import org.openzen.zenscript.codemodel.scope.TypeScope;
@@ -81,6 +82,9 @@ public class SetterMember extends PropertyMember {
81 82
 
82 83
 	@Override
83 84
 	public void normalize(TypeScope scope) {
85
+		if (!Modifiers.hasAccess(modifiers))
86
+			modifiers |= Modifiers.INTERNAL;
87
+		
84 88
 		if (body != null)
85 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 Bestand weergeven

@@ -20,7 +20,13 @@ public interface DefinitionMemberRef {
20 20
 	
21 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 31
 	StoredType getOwnerType();
26 32
 	

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

@@ -173,7 +173,7 @@ public class TypeMemberBuilder implements TypeVisitorWithContext<Void, Void, Run
173 173
 	
174 174
 	@Override
175 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 178
 		constructor(builtin, STRING_CONSTRUCTOR_CHARACTERS, new StoredType(registry.getOptional(registry.getArray(CHAR.stored, 1)), BorrowStorageTag.INVOCATION));
179 179
 		
@@ -199,7 +199,7 @@ public class TypeMemberBuilder implements TypeVisitorWithContext<Void, Void, Run
199 199
 
200 200
 	@Override
201 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 203
 		StoredType baseType = array.elementType;
204 204
 		int dimension = array.dimension;
205 205
 		StorageTag storage = type.getActualStorage();
@@ -350,7 +350,7 @@ public class TypeMemberBuilder implements TypeVisitorWithContext<Void, Void, Run
350 350
 		StoredType keyType = assoc.keyType;
351 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 355
 		constructor(builtin, ASSOC_CONSTRUCTOR);
356 356
 
@@ -398,7 +398,7 @@ public class TypeMemberBuilder implements TypeVisitorWithContext<Void, Void, Run
398 398
 		FunctionHeader putHeader = new FunctionHeader(new TypeParameter[] { functionParameter }, VOID.stored, null, null, new FunctionParameter(valueType));
399 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 402
 		constructor(builtin, GENERICMAP_CONSTRUCTOR);
403 403
 		
404 404
 		method(builtin, "getOptional", getOptionalHeader, GENERICMAP_GETOPTIONAL);
@@ -431,8 +431,8 @@ public class TypeMemberBuilder implements TypeVisitorWithContext<Void, Void, Run
431 431
 
432 432
 	@Override
433 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 437
 		same(builtin, FUNCTION_SAME, type);
438 438
 		notsame(builtin, FUNCTION_NOTSAME, type);
@@ -555,7 +555,7 @@ public class TypeMemberBuilder implements TypeVisitorWithContext<Void, Void, Run
555 555
 	public Void visitRange(Void context, RangeTypeID range) {
556 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 559
 		getter(definition, RANGE_FROM, "from", baseType);
560 560
 		getter(definition, RANGE_TO, "to", baseType);
561 561
 		if (baseType.type == BYTE
@@ -577,7 +577,7 @@ public class TypeMemberBuilder implements TypeVisitorWithContext<Void, Void, Run
577 577
 
578 578
 	@Override
579 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 581
 		modified.baseType.accept(context, this);
582 582
 		
583 583
 		if (modified.isOptional()) {
@@ -590,7 +590,7 @@ public class TypeMemberBuilder implements TypeVisitorWithContext<Void, Void, Run
590 590
 	}
591 591
 	
592 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 594
 		not(builtin, BOOL_NOT, BOOL);
595 595
 		and(builtin, BOOL_AND, BOOL, BOOL);
596 596
 		or(builtin, BOOL_OR, BOOL, BOOL);
@@ -605,7 +605,7 @@ public class TypeMemberBuilder implements TypeVisitorWithContext<Void, Void, Run
605 605
 	}
606 606
 	
607 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 610
 		invert(builtin, BYTE_NOT, BYTE);
611 611
 		inc(builtin, BYTE_INC, BYTE);
@@ -645,7 +645,7 @@ public class TypeMemberBuilder implements TypeVisitorWithContext<Void, Void, Run
645 645
 	}
646 646
 	
647 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 650
 		invert(builtin, SBYTE_NOT, SBYTE);
651 651
 		neg(builtin, SBYTE_NEG, SBYTE);
@@ -687,7 +687,7 @@ public class TypeMemberBuilder implements TypeVisitorWithContext<Void, Void, Run
687 687
 	}
688 688
 	
689 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 692
 		invert(builtin, SHORT_NOT, SHORT);
693 693
 		neg(builtin, SHORT_NEG, SHORT);
@@ -729,7 +729,7 @@ public class TypeMemberBuilder implements TypeVisitorWithContext<Void, Void, Run
729 729
 	}
730 730
 	
731 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 734
 		invert(builtin, USHORT_NOT, USHORT);
735 735
 		inc(builtin, USHORT_INC, USHORT);
@@ -769,7 +769,7 @@ public class TypeMemberBuilder implements TypeVisitorWithContext<Void, Void, Run
769 769
 	}
770 770
 	
771 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 774
 		invert(builtin, INT_NOT, INT);
775 775
 		neg(builtin, INT_NEG, INT);
@@ -850,7 +850,7 @@ public class TypeMemberBuilder implements TypeVisitorWithContext<Void, Void, Run
850 850
 	}
851 851
 
852 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 855
 		invert(builtin, UINT_NOT, INT);
856 856
 		inc(builtin, UINT_DEC, INT);
@@ -930,7 +930,7 @@ public class TypeMemberBuilder implements TypeVisitorWithContext<Void, Void, Run
930 930
 	}
931 931
 	
932 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 935
 		invert(builtin, LONG_NOT, LONG);
936 936
 		neg(builtin, LONG_NEG, LONG);
@@ -1003,7 +1003,7 @@ public class TypeMemberBuilder implements TypeVisitorWithContext<Void, Void, Run
1003 1003
 	}
1004 1004
 	
1005 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 1008
 		invert(builtin, ULONG_NOT, ULONG);
1009 1009
 		inc(builtin, ULONG_DEC, ULONG);
@@ -1075,7 +1075,7 @@ public class TypeMemberBuilder implements TypeVisitorWithContext<Void, Void, Run
1075 1075
 	}
1076 1076
 	
1077 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 1080
 		invert(builtin, USIZE_NOT, USIZE);
1081 1081
 		inc(builtin, USIZE_DEC, USIZE);
@@ -1152,7 +1152,7 @@ public class TypeMemberBuilder implements TypeVisitorWithContext<Void, Void, Run
1152 1152
 	}
1153 1153
 	
1154 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 1157
 		neg(builtin, FLOAT_NEG, FLOAT);
1158 1158
 		inc(builtin, FLOAT_DEC, FLOAT);
@@ -1197,7 +1197,7 @@ public class TypeMemberBuilder implements TypeVisitorWithContext<Void, Void, Run
1197 1197
 	}
1198 1198
 	
1199 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 1202
 		neg(builtin, DOUBLE_NEG, DOUBLE);
1203 1203
 		inc(builtin, DOUBLE_DEC, DOUBLE);
@@ -1233,7 +1233,7 @@ public class TypeMemberBuilder implements TypeVisitorWithContext<Void, Void, Run
1233 1233
 	}
1234 1234
 
1235 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 1238
 		add(builtin, CHAR_ADD_INT, INT, CHAR);
1239 1239
 		sub(builtin, CHAR_SUB_INT, INT, CHAR);

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

@@ -1821,9 +1821,13 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1821 1821
 	@Override
1822 1822
 	public Void visitGetter(GetterExpression expression) {
1823 1823
 		expression.target.accept(this);
1824
-
1824
+		
1825 1825
 		BuiltinID builtin = expression.getter.member.builtin;
1826 1826
 		if (builtin == null) {
1827
+			if (expression.getter.hasTag(JavaField.class)) {
1828
+				javaWriter.getField(expression.getter.getTag(JavaField.class));
1829
+				return null;
1830
+			}
1827 1831
 			if (!checkAndExecuteMethodInfo(expression.getter, expression.type))
1828 1832
 				throw new IllegalStateException("Call target has no method info!");
1829 1833
 
@@ -2285,6 +2289,11 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
2285 2289
 	public Void visitStaticGetter(StaticGetterExpression expression) {
2286 2290
 		BuiltinID builtin = expression.getter.member.builtin;
2287 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 2297
 			if (!checkAndExecuteMethodInfo(expression.getter, expression.type))
2289 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 Bestand weergeven

@@ -77,11 +77,15 @@ public class JavaPrepareClassMethodVisitor implements MemberVisitor<Void> {
77 77
 	
78 78
 	@Override
79 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 83
 			visitGetter(member.autoGetter);
83
-		if (member.hasAutoSetter())
84
+			member.autoGetter.setTag(JavaField.class, field);
85
+		}
86
+		if (member.hasAutoSetter()) {
84 87
 			visitSetter(member.autoSetter);
88
+		}
85 89
 		
86 90
 		return null;
87 91
 	}

+ 4
- 6
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaDefinitionVisitor.java Bestand weergeven

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

+ 3
- 3
Parser/src/main/java/org/openzen/zenscript/parser/ParsedFile.java Bestand weergeven

@@ -152,8 +152,8 @@ public class ParsedFile {
152 152
 					case K_PRIVATE:
153 153
 						modifiers |= Modifiers.PRIVATE;
154 154
 						break;
155
-					case K_EXPORT:
156
-						modifiers |= Modifiers.EXPORT;
155
+					case K_INTERNAL:
156
+						modifiers |= Modifiers.INTERNAL;
157 157
 						break;
158 158
 					case K_EXTERN:
159 159
 						modifiers |= Modifiers.EXTERN;
@@ -299,7 +299,7 @@ public class ParsedFile {
299 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 303
 			block.setTag(SourceFile.class, file);
304 304
 			block.setTag(WhitespacePostComment.class, postComment);
305 305
 			scripts.add(block);

+ 2
- 2
Parser/src/main/java/org/openzen/zenscript/parser/member/ParsedDefinitionMember.java Bestand weergeven

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

+ 83
- 0
ScriptingExample/scripts/classes.zs Bestand weergeven

@@ -0,0 +1,83 @@
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 Bestand weergeven

@@ -0,0 +1,58 @@
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 Bestand weergeven

@@ -0,0 +1,20 @@
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 Bestand weergeven

@@ -0,0 +1,19 @@
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 Bestand weergeven

@@ -0,0 +1 @@
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 Bestand weergeven

@@ -0,0 +1,22 @@
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 Bestand weergeven

@@ -0,0 +1,7 @@
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 Bestand weergeven

@@ -0,0 +1,51 @@
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 Bestand weergeven

@@ -0,0 +1,94 @@
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 Bestand weergeven

@@ -0,0 +1,2 @@
1
+//while true
2
+//	println("Hello!");

+ 18
- 0
ScriptingExample/scripts/switch.zs Bestand weergeven

@@ -0,0 +1,18 @@
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 Bestand weergeven

@@ -0,0 +1,70 @@
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 Bestand weergeven

@@ -19,10 +19,10 @@ import org.openzen.zenscript.codemodel.context.TypeResolutionContext;
19 19
 import org.openzen.zenscript.codemodel.definition.ClassDefinition;
20 20
 import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
21 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 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 26
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
27 27
 import org.openzen.zenscript.codemodel.partial.PartialMemberGroupExpression;
28 28
 import org.openzen.zenscript.codemodel.scope.BaseScope;
@@ -54,18 +54,18 @@ public class GlobalRegistry {
54 54
 		PRINTSTREAM_PRINTLN = new MethodMember(
55 55
 			CodePosition.NATIVE,
56 56
 			PRINTSTREAM,
57
-			Modifiers.EXPORT,
57
+			Modifiers.PUBLIC,
58 58
 			"println",
59 59
 			new FunctionHeader(BasicTypeID.VOID, new FunctionParameter(StringTypeID.BORROW)),
60 60
 			null);
61 61
 		
62
-		SYSTEM_OUT = new FieldMember(
62
+		SYSTEM_OUT = new GetterMember(
63 63
 			CodePosition.NATIVE,
64 64
 			SYSTEM,
65
-			Modifiers.EXPORT | Modifiers.FINAL,
65
+			Modifiers.PUBLIC | Modifiers.FINAL | Modifiers.STATIC,
66 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 70
 		JavaClass jPrintStream = new JavaClass("java.io", "PrintStream", JavaClass.Kind.CLASS);
71 71
 		JavaMethod printstreamPrintln = JavaMethod.getNativeVirtual(jPrintStream, "println", "(Ljava/lang/String;)V");
@@ -111,10 +111,10 @@ public class GlobalRegistry {
111 111
 	}
112 112
 	
113 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 116
 	private final MethodMember PRINTSTREAM_PRINTLN;
117
-	private final FieldMember SYSTEM_OUT;
117
+	private final GetterMember SYSTEM_OUT;
118 118
 	
119 119
 	private class PrintlnSymbol implements ISymbol {
120 120
 
@@ -123,7 +123,7 @@ public class GlobalRegistry {
123 123
 			return new PartialMemberGroupExpression(
124 124
 					position,
125 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 127
 					"println",
128 128
 					PRINTSTREAM_PRINTLN.ref(scope.getTypeRegistry().getForDefinition(PRINTSTREAM).stored(BorrowStorageTag.INVOCATION), GenericMapper.EMPTY),
129 129
 					null,

+ 2
- 1
Validator/src/main/java/org/openzen/zenscript/validator/TypeContext.java Bestand weergeven

@@ -20,7 +20,8 @@ public enum TypeContext {
20 20
 	EXPANSION_TARGET_TYPE("expansion target type"),
21 21
 	OPTION_MEMBER_TYPE("option member type"),
22 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 26
 	public final String display;
26 27
 	

+ 4
- 1
Validator/src/main/java/org/openzen/zenscript/validator/ValidationLogEntry.java Bestand weergeven

@@ -80,6 +80,9 @@ public class ValidationLogEntry {
80 80
 		INVALID_CASE,
81 81
 		INVALID_STORAGE_CAST,
82 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 Bestand weergeven

@@ -9,6 +9,7 @@ import java.util.ArrayList;
9 9
 import java.util.Collections;
10 10
 import java.util.List;
11 11
 import org.openzen.zencode.shared.CodePosition;
12
+import org.openzen.zenscript.codemodel.AccessScope;
12 13
 import org.openzen.zenscript.codemodel.FunctionHeader;
13 14
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
14 15
 import org.openzen.zenscript.codemodel.ScriptBlock;
@@ -44,7 +45,7 @@ public class Validator {
44 45
 	}
45 46
 	
46 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 49
 		for (Statement statement : script.statements) {
49 50
 			statement.accept(statementValidator);
50 51
 		}
@@ -68,6 +69,11 @@ public class Validator {
68 69
 	}
69 70
 	
70 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 78
 		@Override
73 79
 		public boolean isConstructor() {
@@ -93,5 +99,10 @@ public class Validator {
93 99
 		public HighLevelDefinition getDefinition() {
94 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 Bestand weergeven

@@ -5,6 +5,7 @@
5 5
  */
6 6
 package org.openzen.zenscript.validator.analysis;
7 7
 
8
+import org.openzen.zenscript.codemodel.AccessScope;
8 9
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
9 10
 import org.openzen.zenscript.codemodel.member.EnumConstantMember;
10 11
 import org.openzen.zenscript.codemodel.member.FieldMember;
@@ -15,21 +16,23 @@ import org.openzen.zenscript.codemodel.statement.VarStatement;
15 16
  * @author Hoofdgebruiker
16 17
  */
17 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 Bestand weergeven

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

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

@@ -9,6 +9,7 @@ import java.util.ArrayList;
9 9
 import java.util.HashSet;
10 10
 import java.util.List;
11 11
 import java.util.Set;
12
+import org.openzen.zenscript.codemodel.AccessScope;
12 13
 import org.openzen.zenscript.codemodel.FunctionHeader;
13 14
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
14 15
 import org.openzen.zenscript.codemodel.Modifiers;
@@ -115,13 +116,13 @@ public class DefinitionMemberValidator implements MemberVisitor<Void> {
115 116
 			}
116 117
 		}
117 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 121
 		if (member.body == null && !member.isExtern()) {
121 122
 			validator.logError(ValidationLogEntry.Code.BODY_REQUIRED, member.position, "Constructors must have a body");
122 123
 			return null;
123 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 126
 			member.body.accept(statementValidator);
126 127
 			validateThrow(member, member.header, member.body);
127 128
 			
@@ -142,15 +143,15 @@ public class DefinitionMemberValidator implements MemberVisitor<Void> {
142 143
 		if (member.header.thrownType != null)
143 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 147
 		return null;
147 148
 	}
148 149
 
149 150
 	@Override
150 151
 	public Void visitMethod(MethodMember member) {
151 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 155
 		return null;
155 156
 	}
156 157
 
@@ -158,7 +159,7 @@ public class DefinitionMemberValidator implements MemberVisitor<Void> {
158 159
 	public Void visitGetter(GetterMember member) {
159 160
 		ValidationUtils.validateIdentifier(validator, member.position, member.name);
160 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 163
 		return null;
163 164
 	}
164 165
 
@@ -166,7 +167,7 @@ public class DefinitionMemberValidator implements MemberVisitor<Void> {
166 167
 	public Void visitSetter(SetterMember member) {
167 168
 		ValidationUtils.validateIdentifier(validator, member.position, member.name);
168 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 171
 		return null;
171 172
 	}
172 173
 	
@@ -184,15 +185,15 @@ public class DefinitionMemberValidator implements MemberVisitor<Void> {
184 185
 
185 186
 	@Override
186 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 190
 		return null;
190 191
 	}
191 192
 
192 193
 	@Override
193 194
 	public Void visitCaster(CasterMember member) {
194 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 197
 		return null;
197 198
 	}
198 199
 
@@ -202,14 +203,16 @@ public class DefinitionMemberValidator implements MemberVisitor<Void> {
202 203
 		for (StoredType type : member.getLoopVariableTypes())
203 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 209
 		return null;
207 210
 	}
208 211
 
209 212
 	@Override
210 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 216
 		return null;
214 217
 	}
215 218
 
@@ -279,7 +282,7 @@ public class DefinitionMemberValidator implements MemberVisitor<Void> {
279 282
 
280 283
 	@Override
281 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 286
 		if (member.body.thrownType != null)
284 287
 			validator.logError(ValidationLogEntry.Code.STATIC_INITIALIZER_CANNOT_THROW, member.position, "Static initializer cannot throw");
285 288
 		return null;
@@ -386,13 +389,20 @@ public class DefinitionMemberValidator implements MemberVisitor<Void> {
386 389
 		public HighLevelDefinition getDefinition() {
387 390
 			return definition;
388 391
 		}
392
+
393
+		@Override
394
+		public AccessScope getAccessScope() {
395
+			return field.getAccessScope();
396
+		}
389 397
 	}
390 398
 	
391 399
 	private class ConstructorStatementScope implements StatementScope {
392 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 404
 			this.header = header;
405
+			this.access = access;
396 406
 		}
397 407
 
398 408
 		@Override
@@ -419,13 +429,20 @@ public class DefinitionMemberValidator implements MemberVisitor<Void> {
419 429
 		public HighLevelDefinition getDefinition() {
420 430
 			return definition;
421 431
 		}
432
+
433
+		@Override
434
+		public AccessScope getAccessScope() {
435
+			return access;
436
+		}
422 437
 	}
423 438
 	
424 439
 	private class MethodStatementScope implements StatementScope {
425 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 444
 			this.header = header;
445
+			this.access = access;
429 446
 		}
430 447
 
431 448
 		@Override
@@ -452,10 +469,20 @@ public class DefinitionMemberValidator implements MemberVisitor<Void> {
452 469
 		public HighLevelDefinition getDefinition() {
453 470
 			return definition;
454 471
 		}
472
+
473
+		@Override
474
+		public AccessScope getAccessScope() {
475
+			return access;
476
+		}
455 477
 	}
456 478
 	
457 479
 	private class StaticInitializerScope implements StatementScope {
458 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 487
 		@Override
461 488
 		public boolean isConstructor() {
@@ -481,6 +508,11 @@ public class DefinitionMemberValidator implements MemberVisitor<Void> {
481 508
 		public HighLevelDefinition getDefinition() {
482 509
 			return definition;
483 510
 		}
511
+
512
+		@Override
513
+		public AccessScope getAccessScope() {
514
+			return access;
515
+		}
484 516
 	}
485 517
 	
486 518
 	private class EnumConstantInitializerScope implements ExpressionScope {
@@ -533,5 +565,10 @@ public class DefinitionMemberValidator implements MemberVisitor<Void> {
533 565
 		public HighLevelDefinition getDefinition() {
534 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 Bestand weergeven

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

@@ -10,12 +10,15 @@ import java.util.Set;
10 10
 import org.openzen.zencode.shared.CodePosition;
11 11
 import org.openzen.zenscript.codemodel.FunctionHeader;
12 12
 import org.openzen.zenscript.codemodel.FunctionParameter;
13
+import org.openzen.zenscript.codemodel.Modifiers;
13 14
 import org.openzen.zenscript.codemodel.definition.EnumDefinition;
14 15
 import org.openzen.zenscript.codemodel.definition.VariantDefinition;
15 16
 import org.openzen.zenscript.codemodel.expression.*;
16 17
 import org.openzen.zenscript.codemodel.expression.switchvalue.EnumConstantSwitchValue;
17 18
 import org.openzen.zenscript.codemodel.expression.switchvalue.VariantOptionSwitchValue;
18 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 22
 import org.openzen.zenscript.codemodel.type.ArrayTypeID;
20 23
 import org.openzen.zenscript.codemodel.type.AssocTypeID;
21 24
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
@@ -79,6 +82,9 @@ public class ExpressionValidator implements ExpressionVisitor<Void> {
79 82
 		if (!expression.right.type.equals(expression.operator.getHeader().parameters[0].type))
80 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 88
 		expression.left.accept(this);
83 89
 		expression.right.accept(this);
84 90
 		return null;
@@ -87,18 +93,24 @@ public class ExpressionValidator implements ExpressionVisitor<Void> {
87 93
 	@Override
88 94
 	public Void visitCall(CallExpression expression) {
89 95
 		expression.target.accept(this);
96
+		
97
+		checkMemberAccess(expression.position, expression.member);
90 98
 		checkCallArguments(expression.position, expression.member.getHeader(), expression.instancedHeader, expression.arguments);
99
+		checkNotStatic(expression.position, expression.member);
91 100
 		return null;
92 101
 	}
93 102
 
94 103
 	@Override
95 104
 	public Void visitCallStatic(CallStaticExpression expression) {
105
+		checkMemberAccess(expression.position, expression.member);
96 106
 		checkCallArguments(expression.position, expression.member.getHeader(), expression.instancedHeader, expression.arguments);
107
+		checkStatic(expression.position, expression.member);
97 108
 		return null;
98 109
 	}
99 110
 	
100 111
 	@Override
101 112
 	public Void visitConst(ConstExpression expression) {
113
+		checkMemberAccess(expression.position, expression.constant);
102 114
 		return null;
103 115
 	}
104 116
 
@@ -129,6 +141,7 @@ public class ExpressionValidator implements ExpressionVisitor<Void> {
129 141
 
130 142
 	@Override
131 143
 	public Void visitCast(CastExpression expression) {
144
+		checkMemberAccess(expression.position, expression.member);
132 145
 		return expression.target.accept(this);
133 146
 	}
134 147
 
@@ -247,6 +260,8 @@ public class ExpressionValidator implements ExpressionVisitor<Void> {
247 260
 
248 261
 	@Override
249 262
 	public Void visitConstructorSuperCall(ConstructorSuperCallExpression expression) {
263
+		checkMemberAccess(expression.position, expression.constructor);
264
+		
250 265
 		if (!scope.isConstructor()) {
251 266
 			validator.logError(ValidationLogEntry.Code.CONSTRUCTOR_FORWARD_OUTSIDE_CONSTRUCTOR, expression.position, "Can only forward constructors inside constructors");
252 267
 		}
@@ -277,6 +292,9 @@ public class ExpressionValidator implements ExpressionVisitor<Void> {
277 292
 
278 293
 	@Override
279 294
 	public Void visitGetField(GetFieldExpression expression) {
295
+		checkFieldAccess(expression.position, expression.field);
296
+		checkNotStatic(expression.position, expression.field);
297
+		
280 298
 		expression.target.accept(this);
281 299
 		if (expression.target instanceof ThisExpression && !scope.isFieldInitialized(expression.field.member)) {
282 300
 			validator.logError(
@@ -310,11 +328,15 @@ public class ExpressionValidator implements ExpressionVisitor<Void> {
310 328
 
311 329
 	@Override
312 330
 	public Void visitGetStaticField(GetStaticFieldExpression expression) {
331
+		checkFieldAccess(expression.position, expression.field);
332
+		checkStatic(expression.position, expression.field);
313 333
 		return null;
314 334
 	}
315 335
 
316 336
 	@Override
317 337
 	public Void visitGetter(GetterExpression expression) {
338
+		checkMemberAccess(expression.position, expression.getter);
339
+		checkStatic(expression.position, expression.getter);
318 340
 		return expression.target.accept(this);
319 341
 	}
320 342
 	
@@ -450,6 +472,8 @@ public class ExpressionValidator implements ExpressionVisitor<Void> {
450 472
 
451 473
 	@Override
452 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 477
 		checkCallArguments(
454 478
 				expression.position,
455 479
 				expression.constructor.getHeader(),
@@ -487,6 +511,9 @@ public class ExpressionValidator implements ExpressionVisitor<Void> {
487 511
 	
488 512
 	@Override
489 513
 	public Void visitPostCall(PostCallExpression expression) {
514
+		checkMemberAccess(expression.position, expression.member);
515
+		checkNotStatic(expression.position, expression.member);
516
+		
490 517
 		expression.target.accept(this);
491 518
 		// TODO: is target a valid increment target?
492 519
 		return null;
@@ -516,6 +543,9 @@ public class ExpressionValidator implements ExpressionVisitor<Void> {
516 543
 
517 544
 	@Override
518 545
 	public Void visitSetField(SetFieldExpression expression) {
546
+		checkFieldAccess(expression.position, expression.field);
547
+		checkNotStatic(expression.position, expression.field);
548
+		
519 549
 		expression.target.accept(this);
520 550
 		expression.value.accept(this);
521 551
 		if (!expression.value.type.equals(expression.field.getType())) {
@@ -561,6 +591,9 @@ public class ExpressionValidator implements ExpressionVisitor<Void> {
561 591
 
562 592
 	@Override
563 593
 	public Void visitSetStaticField(SetStaticFieldExpression expression) {
594
+		checkFieldAccess(expression.position, expression.field);
595
+		checkStatic(expression.position, expression.field);
596
+		
564 597
 		expression.value.accept(this);
565 598
 		if (!expression.value.type.equals(expression.field.getType())) {
566 599
 			validator.logError(
@@ -581,6 +614,9 @@ public class ExpressionValidator implements ExpressionVisitor<Void> {
581 614
 
582 615
 	@Override
583 616
 	public Void visitSetter(SetterExpression expression) {
617
+		checkMemberAccess(expression.position, expression.setter);
618
+		checkNotStatic(expression.position, expression.setter);
619
+		
584 620
 		expression.target.accept(this);
585 621
 		expression.value.accept(this);
586 622
 		if (!expression.value.type.equals(expression.setter.getType())) {
@@ -594,11 +630,16 @@ public class ExpressionValidator implements ExpressionVisitor<Void> {
594 630
 
595 631
 	@Override
596 632
 	public Void visitStaticGetter(StaticGetterExpression expression) {
633
+		checkMemberAccess(expression.position, expression.getter);
634
+		checkStatic(expression.position, expression.getter);
597 635
 		return null;
598 636
 	}
599 637
 
600 638
 	@Override
601 639
 	public Void visitStaticSetter(StaticSetterExpression expression) {
640
+		checkMemberAccess(expression.position, expression.setter);
641
+		checkStatic(expression.position, expression.setter);
642
+		
602 643
 		expression.value.accept(this);
603 644
 		if (!expression.value.type.equals(expression.setter.getType())) {
604 645
 			validator.logError(
@@ -683,6 +724,26 @@ public class ExpressionValidator implements ExpressionVisitor<Void> {
683 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 747
 	private void checkCallArguments(CodePosition position, FunctionHeader originalHeader, FunctionHeader instancedHeader, CallArguments arguments) {
687 748
 		ValidationUtils.validateTypeArguments(validator, position, originalHeader.typeParameters, arguments.typeArguments);
688 749
 		

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

@@ -7,6 +7,7 @@ package org.openzen.zenscript.validator.visitors;
7 7
 
8 8
 import java.util.HashSet;
9 9
 import java.util.Set;
10
+import org.openzen.zenscript.codemodel.AccessScope;
10 11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
11 12
 import org.openzen.zenscript.codemodel.expression.Expression;
12 13
 import org.openzen.zenscript.codemodel.member.EnumConstantMember;
@@ -303,5 +304,10 @@ public class StatementValidator implements StatementVisitor<Void> {
303 304
 		public HighLevelDefinition getDefinition() {
304 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 Bestand weergeven

@@ -6,6 +6,7 @@
6 6
 package org.openzen.zenscript.validator.visitors;
7 7
 
8 8
 import org.openzen.zencode.shared.CodePosition;
9
+import org.openzen.zenscript.codemodel.AccessScope;
9 10
 import org.openzen.zenscript.codemodel.type.ArrayTypeID;
10 11
 import org.openzen.zenscript.codemodel.type.AssocTypeID;
11 12
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
@@ -102,7 +103,7 @@ public class TypeValidator implements TypeVisitorWithContext<TypeContext, Void,
102 103
 
103 104
 	@Override
104 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 107
 		return null;
107 108
 	}
108 109
 

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

@@ -9,6 +9,7 @@ import java.util.HashSet;
9 9
 import java.util.Set;
10 10
 import java.util.regex.Pattern;
11 11
 import org.openzen.zencode.shared.CodePosition;
12
+import org.openzen.zenscript.codemodel.AccessScope;
12 13
 import org.openzen.zenscript.codemodel.FunctionHeader;
13 14
 import org.openzen.zenscript.codemodel.FunctionParameter;
14 15
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
@@ -52,7 +53,7 @@ public class ValidationUtils {
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 57
 		TypeValidator typeValidator = new TypeValidator(target, position);
57 58
 		typeValidator.validate(TypeContext.RETURN_TYPE, header.getReturnType());
58 59
 		
@@ -72,7 +73,7 @@ public class ValidationUtils {
72 73
 			typeValidator.validate(TypeContext.PARAMETER_TYPE, parameter.type);
73 74
 			
74 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 77
 				if (parameter.defaultValue.type != parameter.type) {
77 78
 					target.logError(INVALID_TYPE, position, "default value does not match parameter type");
78 79
 				}
@@ -97,16 +98,16 @@ public class ValidationUtils {
97 98
 			CodePosition position,
98 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 103
 		if (Modifiers.isPublic(modifiers) && Modifiers.isPrivate(modifiers))
103 104
 			target.logError(INVALID_MODIFIER, position, error + ": cannot combine public and private");
104 105
 		if (Modifiers.isPublic(modifiers) && Modifiers.isProtected(modifiers))
105 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 111
 		if (Modifiers.isPrivate(modifiers) && Modifiers.isProtected(modifiers))
111 112
 			target.logError(INVALID_MODIFIER, position, error + ": cannot combine private and protected");
112 113
 		
@@ -123,8 +124,8 @@ public class ValidationUtils {
123 124
 		
124 125
 		if (Modifiers.isPublic(invalid))
125 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 129
 		if (Modifiers.isProtected(invalid))
129 130
 			target.logError(INVALID_MODIFIER, position, error + ": protected");
130 131
 		if (Modifiers.isPrivate(invalid))
@@ -220,6 +221,11 @@ public class ValidationUtils {
220 221
 	}
221 222
 	
222 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 230
 		@Override
225 231
 		public boolean isConstructor() {
@@ -265,5 +271,10 @@ public class ValidationUtils {
265 271
 		public HighLevelDefinition getDefinition() {
266 272
 			return null;
267 273
 		}
274
+
275
+		@Override
276
+		public AccessScope getAccessScope() {
277
+			return access;
278
+		}
268 279
 	}
269 280
 }

Laden…
Annuleren
Opslaan