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