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