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 import java.util.*; 011 012 aspect Names { 013 // simple names 014 syn String ParseName.name() = getID(); 015 syn String PackageOrTypeAccess.name() = getID(); 016 syn String AmbiguousAccess.name() = getID(); 017 syn String VarAccess.name() = getID(); 018 syn String MethodAccess.name() = getID(); 019 syn String ConstructorAccess.name() = "this"; 020 syn String SuperConstructorAccess.name() = "super"; 021 syn String TypeAccess.name() = getID(); 022 023 syn String PackageAccess.name() = getPackage(); 024 025 syn String Expr.packageName() = ""; 026 eq TypeAccess.packageName() = getPackage(); 027 028 eq PackageAccess.packageName() { 029 StringBuffer s = new StringBuffer(); 030 if(hasPrevExpr()) { 031 s.append(prevExpr().packageName()); 032 s.append("."); 033 } 034 s.append(getPackage()); 035 return s.toString(); 036 } 037 eq PackageOrTypeAccess.packageName() { 038 StringBuffer s = new StringBuffer(); 039 if(hasPrevExpr()) { 040 s.append(prevExpr().packageName()); 041 s.append("."); 042 } 043 s.append(name()); 044 return s.toString(); 045 } 046 047 048 // human readable qualified names 049 syn String TypeAccess.nameWithPackage() = getPackage().equals("") ? name() : (getPackage() + "." + name()); 050 051 syn String ImportDecl.typeName() { 052 Access a = getAccess().lastAccess(); 053 String name = a.isTypeAccess() ? ((TypeAccess)a).nameWithPackage() : ""; 054 while(a.hasPrevExpr() && a.prevExpr() instanceof Access) { 055 Access pred = (Access)a.prevExpr(); 056 if(pred.isTypeAccess()) 057 name = ((TypeAccess)pred).nameWithPackage() + "." + name; 058 a = pred; 059 } 060 return name; 061 } 062 syn String Expr.typeName() = ""; 063 eq AbstractDot.typeName() = lastAccess().typeName(); 064 eq TypeAccess.typeName() = isQualified() ? (qualifier().typeName() + "." + name()) : nameWithPackage(); 065 } 066 067 aspect TypeName { 068 syn String TypeDecl.name() = getID(); 069 070 syn lazy String TypeDecl.fullName() { 071 if(isNestedType()) 072 return enclosingType().fullName() + "." + name(); 073 String packageName = packageName(); 074 if(packageName.equals("")) 075 return name(); 076 return packageName + "." + name(); 077 } 078 079 syn lazy String TypeDecl.typeName() { 080 if(isNestedType()) 081 return enclosingType().typeName() + "." + name(); 082 String packageName = packageName(); 083 if(packageName.equals("") || packageName.equals(PRIMITIVE_PACKAGE_NAME)) 084 return name(); 085 return packageName + "." + name(); 086 } 087 eq ArrayDecl.typeName() = componentType().typeName() + "[]"; 088 089 inh lazy String TypeDecl.packageName(); 090 eq CompilationUnit.getChild().packageName() = packageName(); 091 092 syn lazy String CompilationUnit.packageName() {return getPackageDecl();} 093 } 094 095 aspect CreateQualifiedAccesses { 096 public Access TypeDecl.createQualifiedAccess() { 097 if(isLocalClass() || isAnonymous()) { 098 return new TypeAccess(name()); 099 } 100 else if(!isTopLevelType()) { 101 return enclosingType().createQualifiedAccess().qualifiesAccess(new TypeAccess(name())); 102 } 103 else { 104 return new TypeAccess(packageName(), name()); 105 } 106 } 107 108 public Access PrimitiveType.createQualifiedAccess() { 109 return new PrimitiveTypeAccess(name()); 110 } 111 } 112 113 114