001    /*
002     * The JastAdd Extensible Java Compiler (http://jastadd.org) is covered
003     * by the modified BSD License. You should have received a copy of the
004     * modified BSD license with this compiler.
005     * 
006     * Copyright (c) 2005-2008, Torbjorn Ekman
007     * All rights reserved.
008     */
009    
010    aspect PrimitiveTypes {
011      protected static final String ASTNode.PRIMITIVE_PACKAGE_NAME = "@primitive";
012    
013    /* ES: Replacing this with a create method used in type lookup the first time a primitive type is requested
014      private boolean Program.initPrimTypes = false;
015      public void Program.addPrimitiveTypes() {
016        if(!initPrimTypes) {
017          initPrimTypes = true;
018        
019        CompilationUnit u = new CompilationUnit();
020        u.setPackageDecl(PRIMITIVE_PACKAGE_NAME);
021        addCompilationUnit(u);
022    
023        TypeDecl classDecl = generateUnknownType();
024        u.addTypeDecl(classDecl);
025        TypeDecl unknown = classDecl;
026    
027        classDecl = generatePrimitiveType(new BooleanType(), "boolean", unknown);
028        u.addTypeDecl(classDecl);
029        
030        classDecl = generatePrimitiveType(new DoubleType(), "double", unknown);
031        u.addTypeDecl(classDecl);
032        
033        classDecl = generatePrimitiveType(new FloatType(), "float", classDecl);
034        u.addTypeDecl(classDecl);
035        
036        classDecl = generatePrimitiveType(new LongType(), "long", classDecl);
037        u.addTypeDecl(classDecl);
038        
039        classDecl = generatePrimitiveType(new IntType(), "int", classDecl);
040        u.addTypeDecl(classDecl);
041        TypeDecl intDecl = classDecl;
042        
043        classDecl = generatePrimitiveType(new ShortType(), "short", classDecl);
044        u.addTypeDecl(classDecl);
045        
046        classDecl = generatePrimitiveType(new ByteType(), "byte", classDecl);
047        u.addTypeDecl(classDecl);
048        
049        classDecl = generatePrimitiveType(new CharType(), "char", intDecl);
050        u.addTypeDecl(classDecl);
051        
052        classDecl = new NullType();
053        classDecl.setModifiers(new Modifiers(new List().add(new Modifier("public"))));
054        classDecl.setID("null");
055        u.addTypeDecl(classDecl);
056    
057        classDecl = new VoidType();
058        classDecl.setModifiers(new Modifiers(new List().add(new Modifier("public"))));
059        classDecl.setID("void");
060        u.addTypeDecl(classDecl);
061    
062        }
063      }
064    
065    
066      public TypeDecl Program.generatePrimitiveType(PrimitiveType type, String name, TypeDecl superType) {
067        type.setModifiers(new Modifiers(new List().add(new Modifier("public"))));
068        type.setID(name);
069        if(superType != null)
070          type.setSuperClassAccess(superType.createQualifiedAccess());
071        return type;
072      }
073    
074      private TypeDecl Program.generateUnknownType() {
075        ClassDecl classDecl = new UnknownType();
076        classDecl.setModifiers(new Modifiers(new List().add(new Modifier("public"))));
077        classDecl.setID("Unknown");
078        MethodDecl methodDecl = new MethodDecl(
079            new Modifiers(new List().add(
080              new Modifier("public")
081            )),
082            new PrimitiveTypeAccess("Unknown"),
083            "unknown",
084            new List(),
085            new List(),
086            new Opt()
087        );
088        classDecl.addBodyDecl(methodDecl);
089        FieldDeclaration fieldDecl = new FieldDeclaration(
090            new Modifiers(new List().add(
091              new Modifier("public")
092            )),
093            new PrimitiveTypeAccess("Unknown"),
094            "unknown",
095            new Opt()
096        );
097        classDecl.addBodyDecl(fieldDecl);   
098        ConstructorDecl constrDecl = new ConstructorDecl(
099          new Modifiers(new List().add(new Modifier("public"))),
100          "Unknown",
101          new List(),
102          new List(),
103          new Opt(),
104          new Block()
105        );
106        classDecl.addBodyDecl(constrDecl);
107          
108        return classDecl;
109      }
110    
111    */
112    
113      syn nta TypeDecl PrimitiveCompilationUnit.typeBoolean() {
114        BooleanType type = new BooleanType();
115        type.setModifiers(new Modifiers(new List().add(new Modifier("public"))));
116        type.setID("boolean");
117        type.setSuperClassAccess(unknownType().createQualifiedAccess());
118        return type;
119      }
120      syn nta TypeDecl PrimitiveCompilationUnit.typeByte() {
121        ByteType type = new ByteType();
122        type.setModifiers(new Modifiers(new List().add(new Modifier("public"))));
123        type.setID("byte");
124        type.setSuperClassAccess(typeShort().createQualifiedAccess());
125        return type;
126      }
127      syn nta TypeDecl PrimitiveCompilationUnit.typeShort() {
128        ShortType type = new ShortType();
129        type.setModifiers(new Modifiers(new List().add(new Modifier("public"))));
130        type.setID("short");
131        type.setSuperClassAccess(typeInt().createQualifiedAccess());
132        return type;
133      }
134      syn nta TypeDecl PrimitiveCompilationUnit.typeChar() {
135        CharType type = new CharType();
136        type.setModifiers(new Modifiers(new List().add(new Modifier("public"))));
137        type.setID("char");
138        type.setSuperClassAccess(typeInt().createQualifiedAccess());
139        return type;
140      }
141      syn nta TypeDecl PrimitiveCompilationUnit.typeInt() {
142        IntType type = new IntType();
143        type.setModifiers(new Modifiers(new List().add(new Modifier("public"))));
144        type.setID("int");
145        type.setSuperClassAccess(typeLong().createQualifiedAccess());
146        return type;
147      }
148      syn nta TypeDecl PrimitiveCompilationUnit.typeLong() {
149        LongType type = new LongType();
150        type.setModifiers(new Modifiers(new List().add(new Modifier("public"))));
151        type.setID("long");
152        // Float doesn't seem right here, keeping it because the old code does this
153        type.setSuperClassAccess(typeFloat().createQualifiedAccess()); 
154        return type;
155      }
156      syn nta TypeDecl PrimitiveCompilationUnit.typeFloat() {
157        FloatType type = new FloatType();
158        type.setModifiers(new Modifiers(new List().add(new Modifier("public"))));
159        type.setID("float");
160        type.setSuperClassAccess(typeDouble().createQualifiedAccess());
161        return type;
162      }
163      syn nta TypeDecl PrimitiveCompilationUnit.typeDouble() {
164        DoubleType type = new DoubleType();
165        type.setModifiers(new Modifiers(new List().add(new Modifier("public"))));
166        type.setID("double");
167        type.setSuperClassAccess(unknownType().createQualifiedAccess());
168        return type;
169      }
170      syn nta TypeDecl PrimitiveCompilationUnit.typeVoid() {
171        VoidType classDecl = new VoidType();
172        classDecl.setModifiers(new Modifiers(new List().add(new Modifier("public"))));
173        classDecl.setID("void");
174        return classDecl;
175      }
176      syn nta TypeDecl PrimitiveCompilationUnit.typeNull() {
177        NullType classDecl = new NullType();
178        classDecl.setModifiers(new Modifiers(new List().add(new Modifier("public"))));
179        classDecl.setID("null");
180        return classDecl;
181      }
182      syn nta TypeDecl PrimitiveCompilationUnit.unknownType() {
183        ClassDecl classDecl = new UnknownType();
184        classDecl.setModifiers(new Modifiers(new List().add(new Modifier("public"))));
185        classDecl.setID("Unknown");
186        MethodDecl methodDecl = new MethodDecl(
187            new Modifiers(new List().add(
188              new Modifier("public")
189            )),
190            new PrimitiveTypeAccess("Unknown"),
191            "unknown",
192            new List(),
193            new List(),
194            new Opt()
195        );
196        classDecl.addBodyDecl(methodDecl);
197        FieldDeclaration fieldDecl = new FieldDeclaration(
198            new Modifiers(new List().add(
199              new Modifier("public")
200            )),
201            new PrimitiveTypeAccess("Unknown"),
202            "unknown",
203            new Opt()
204        );
205        classDecl.addBodyDecl(fieldDecl);   
206        ConstructorDecl constrDecl = new ConstructorDecl(
207          new Modifiers(new List().add(new Modifier("public"))),
208          "Unknown",
209          new List(),
210          new List(),
211          new Opt(),
212          new Block()
213        );
214        classDecl.addBodyDecl(constrDecl);      
215        return classDecl;
216      }
217    
218      // Creates a compilation unit with primitive types
219      syn nta PrimitiveCompilationUnit Program.getPrimitiveCompilationUnit() {    
220        PrimitiveCompilationUnit u = new PrimitiveCompilationUnit();
221        u.setPackageDecl(PRIMITIVE_PACKAGE_NAME);
222        return u;
223      }
224      
225    }
226