]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/DeclarationClassification.java
New SCL completion implementation
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / compilation / DeclarationClassification.java
index 6f82720c4675b805f997e1976695571be3ad6951..ed21f04b2951c9f8bbd8e16ae75c3c7c114c3669 100644 (file)
@@ -25,6 +25,7 @@ import org.simantics.scl.compiler.internal.parsing.declarations.DInstanceAst;
 import org.simantics.scl.compiler.internal.parsing.declarations.DMappingRelationAst;
 import org.simantics.scl.compiler.internal.parsing.declarations.DRelationAst;
 import org.simantics.scl.compiler.internal.parsing.declarations.DRuleAst;
+import org.simantics.scl.compiler.internal.parsing.declarations.DRulesetAst;
 import org.simantics.scl.compiler.internal.parsing.declarations.DTypeAst;
 import org.simantics.scl.compiler.internal.parsing.declarations.DValueAst;
 import org.simantics.scl.compiler.internal.parsing.declarations.DValueTypeAst;
@@ -38,36 +39,37 @@ import org.simantics.scl.compiler.module.ImportDeclaration;
 import gnu.trove.map.hash.THashMap;
 
 public class DeclarationClassification {
-    ArrayList<ImportDeclaration> importsAst = new ArrayList<ImportDeclaration>();
-    ArrayList<DDataAst> dataTypesAst = new ArrayList<DDataAst>();
-    ArrayList<DTypeAst> typeAliasesAst = new ArrayList<DTypeAst>();
-    ValueRepository valueDefinitionsAst = new ValueRepository(); 
-    RelationRepository relationDefinitionsAst = new RelationRepository();
-    ArrayList<DValueTypeAst> typeAnnotationsAst = new ArrayList<DValueTypeAst>();
-    ArrayList<DFixityAst> fixityAst = new ArrayList<DFixityAst>();
-    ArrayList<ProcessedDClassAst> typeClassesAst = new ArrayList<ProcessedDClassAst>();
-    ArrayList<ProcessedDInstanceAst> instancesAst = new ArrayList<ProcessedDInstanceAst>();
-    ArrayList<DDerivingInstanceAst> derivingInstancesAst = new ArrayList<DDerivingInstanceAst>();
-    ArrayList<DEffectAst> effectsAst = new ArrayList<DEffectAst>();
-    ArrayList<DRuleAst> rulesAst = new ArrayList<DRuleAst>();
-    ArrayList<DMappingRelationAst> mappingRelationsAst = new ArrayList<DMappingRelationAst>();
+    public ArrayList<ImportDeclaration> importsAst = new ArrayList<ImportDeclaration>();
+    public ArrayList<DDataAst> dataTypesAst = new ArrayList<DDataAst>();
+    public ArrayList<DTypeAst> typeAliasesAst = new ArrayList<DTypeAst>();
+    public ValueRepository valueDefinitionsAst = new ValueRepository(); 
+    public RelationRepository relationDefinitionsAst = new RelationRepository();
+    public ArrayList<DValueTypeAst> typeAnnotationsAst = new ArrayList<DValueTypeAst>();
+    public ArrayList<DFixityAst> fixityAst = new ArrayList<DFixityAst>();
+    public ArrayList<ProcessedDClassAst> typeClassesAst = new ArrayList<ProcessedDClassAst>();
+    public ArrayList<ProcessedDInstanceAst> instancesAst = new ArrayList<ProcessedDInstanceAst>();
+    public ArrayList<DDerivingInstanceAst> derivingInstancesAst = new ArrayList<DDerivingInstanceAst>();
+    public ArrayList<DEffectAst> effectsAst = new ArrayList<DEffectAst>();
+    public ArrayList<DRuleAst> rulesAst = new ArrayList<DRuleAst>();
+    public ArrayList<DMappingRelationAst> mappingRelationsAst = new ArrayList<DMappingRelationAst>();
+    public ArrayList<DRulesetAst> rulesetsAst = new ArrayList<DRulesetAst>();
     
-    THashMap<String, DDocumentationAst> valueDocumentation = new THashMap<String, DDocumentationAst>();
-    THashMap<String, DDocumentationAst> relationDocumentation = new THashMap<String, DDocumentationAst>();
-    THashMap<String, DDocumentationAst> typeDocumentation = new THashMap<String, DDocumentationAst>();
-    THashMap<String, DDocumentationAst> classDocumentation = new THashMap<String, DDocumentationAst>();
+    public THashMap<String, DDocumentationAst> valueDocumentation = new THashMap<String, DDocumentationAst>();
+    public THashMap<String, DDocumentationAst> relationDocumentation = new THashMap<String, DDocumentationAst>();
+    public THashMap<String, DDocumentationAst> typeDocumentation = new THashMap<String, DDocumentationAst>();
+    public THashMap<String, DDocumentationAst> classDocumentation = new THashMap<String, DDocumentationAst>();
     
-    ArrayList<JavaMethodDeclaration> javaMethodDeclarations = new ArrayList<JavaMethodDeclaration>();
+    public ArrayList<JavaMethodDeclaration> javaMethodDeclarations = new ArrayList<JavaMethodDeclaration>();
     
-    StringBuilder moduleDocumentation = new StringBuilder();
+    public StringBuilder moduleDocumentation = new StringBuilder();
     
-    ArrayList<DAnnotationAst> currentAnnotations = new ArrayList<DAnnotationAst>(2); 
-    DDocumentationAst documentation;
-    String inJavaClass;
+    public ArrayList<DAnnotationAst> currentAnnotations = new ArrayList<DAnnotationAst>(2); 
+    public DDocumentationAst documentation;
+    public String inJavaClass;
     
-    ArrayList<DAnnotationAst> defaultAnnotations = new ArrayList<DAnnotationAst>();
+    public ArrayList<DAnnotationAst> defaultAnnotations = new ArrayList<DAnnotationAst>();
     
-    ErrorLog errorLog;
+    public ErrorLog errorLog;
     
     public DeclarationClassification(CompilationContext compilationContext) {
         this.errorLog = compilationContext.errorLog;
@@ -106,6 +108,8 @@ public class DeclarationClassification {
             handle((DMappingRelationAst)declaration);
         else if(declaration instanceof DRelationAst)
             handle((DRelationAst)declaration);
+        else if(declaration instanceof DRulesetAst)
+            handle((DRulesetAst)declaration);
         else
             throw new InternalCompilerError("Unknown declaration " + declaration.getClass().getSimpleName());
     }
@@ -186,7 +190,7 @@ public class DeclarationClassification {
         importsAst.add(declaration);        
     }
     
-    public void handle(DImportJavaAst declaration) {        
+    public void handle(DImportJavaAst declaration) {
         if(!currentAnnotations.isEmpty()) {
             for(DAnnotationAst annotation : currentAnnotations) {
                 String name = annotation.id.text;
@@ -236,6 +240,10 @@ public class DeclarationClassification {
             errorLog.log(declaration.location, "Annotations not supported.");
             currentAnnotations = new ArrayList<DAnnotationAst>(2);
         }
+        if(declaration.name.name.equals("Eq") || declaration.name.name.equals("Hashable")) {
+               errorLog.logWarning(declaration.location, "Skipped instance definition for " + declaration.name + " for " + declaration.types[0]);
+            return;
+        }
         instancesAst.add(new ProcessedDInstanceAst(
                 declaration,
                 valueDefs));
@@ -246,6 +254,10 @@ public class DeclarationClassification {
             errorLog.log(declaration.location, "Annotations not supported.");
             currentAnnotations = new ArrayList<DAnnotationAst>(2);
         }
+        if(declaration.name.name.equals("Eq") || declaration.name.name.equals("Hashable")) {
+               errorLog.logWarning(declaration.location, "Skipped instance definition for " + declaration.name + " for " + declaration.types[0]);
+            return;
+        }
         derivingInstancesAst.add(declaration);
     }
 
@@ -334,11 +346,19 @@ public class DeclarationClassification {
         }
     }
     
+    public void handle(DRulesetAst declaration) {
+        if(documentation != null) {
+            declaration.documentation = documentation;
+            documentation = null;
+        }
+        rulesetsAst.add(declaration);
+    }
+    
     public void handle(DDocumentationAst declaration) {
         if(documentation != null) {
             errorLog.log(documentation.location, "Invalid documentation string. It precedes another documentation string.");
         }
-        documentation = declaration;                
+        documentation = declaration;
     }
     
     public void handle(DAnnotationAst declaration) {