001 /* Copyright (c) 2005-2008, Torbjorn Ekman 002 * All rights reserved. 003 * 004 * Redistribution and use in source and binary forms, with or without 005 * modification, are permitted provided that the following conditions are met: 006 * 007 * 1. Redistributions of source code must retain the above copyright notice, 008 * this list of conditions and the following disclaimer. 009 * 010 * 2. Redistributions in binary form must reproduce the above copyright notice, 011 * this list of conditions and the following disclaimer in the documentation 012 * and/or other materials provided with the distribution. 013 * 014 * 3. Neither the name of the copyright holder nor the names of its 015 * contributors may be used to endorse or promote products derived from this 016 * software without specific prior written permission. 017 * 018 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 019 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 020 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 021 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 022 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 023 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 024 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 025 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 026 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 027 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 028 * POSSIBILITY OF SUCH DAMAGE. 029 */ 030 031 import java.util.*; 032 033 aspect Names { 034 // simple names 035 syn String ParseName.name() = getID(); 036 syn String VarAccess.name() = getID(); 037 syn String MethodAccess.name() = getID(); 038 syn String ConstructorAccess.name() = "this"; 039 syn String SuperConstructorAccess.name() = "super"; 040 syn String TypeAccess.name() = getID(); 041 042 syn String PackageAccess.name() = getPackage(); 043 044 syn String Expr.packageName() = ""; 045 eq TypeAccess.packageName() = getPackage(); 046 047 eq PackageAccess.packageName() { 048 StringBuilder sb = new StringBuilder(); 049 if (hasPrevExpr()) { 050 sb.append(prevExpr().packageName()); 051 sb.append("."); 052 } 053 sb.append(getPackage()); 054 return sb.toString(); 055 } 056 057 // human readable qualified names 058 syn String TypeAccess.nameWithPackage() = getPackage().equals("") ? name() : (getPackage() + "." + name()); 059 060 syn String ImportDecl.typeName() { 061 Access a = getAccess().lastAccess(); 062 String name = a.isTypeAccess() ? ((TypeAccess) a).nameWithPackage() : ""; 063 while (a.hasPrevExpr() && a.prevExpr() instanceof Access) { 064 Access pred = (Access) a.prevExpr(); 065 if (pred.isTypeAccess()) { 066 name = ((TypeAccess) pred).nameWithPackage() + "." + name; 067 } 068 a = pred; 069 } 070 return name; 071 } 072 syn String Expr.typeName() = ""; 073 eq AbstractDot.typeName() = lastAccess().typeName(); 074 eq TypeAccess.typeName() = isQualified() ? (qualifier().typeName() + "." + name()) : nameWithPackage(); 075 } 076 077 aspect TypeName { 078 syn String TypeDecl.name() = getID(); 079 080 syn lazy String TypeDecl.fullName() { 081 if (isNestedType()) { 082 return enclosingType().fullName() + "." + name(); 083 } 084 String packageName = packageName(); 085 if (packageName.equals("")) { 086 return name(); 087 } 088 return packageName + "." + name(); 089 } 090 091 syn lazy String TypeDecl.typeName() { 092 if (isNestedType()) { 093 return enclosingType().typeName() + "." + name(); 094 } 095 String packageName = packageName(); 096 if (packageName.equals("") || packageName.equals(PRIMITIVE_PACKAGE_NAME)) { 097 return name(); 098 } 099 return packageName + "." + name(); 100 } 101 eq ArrayDecl.typeName() = componentType().typeName() + "[]"; 102 103 inh lazy String TypeDecl.packageName(); 104 eq CompilationUnit.getChild().packageName() = packageName(); 105 106 syn lazy String CompilationUnit.packageName() {return getPackageDecl();} 107 } 108 109 aspect CreateQualifiedAccesses { 110 public Access TypeDecl.createQualifiedAccess() { 111 if (isLocalClass() || isAnonymous()) { 112 return new TypeAccess(name()); 113 } else if (!isTopLevelType()) { 114 return enclosingType().createQualifiedAccess().qualifiesAccess(new TypeAccess(name())); 115 } else { 116 return new TypeAccess(packageName(), name()); 117 } 118 } 119 120 public Access PrimitiveType.createQualifiedAccess() { 121 return new PrimitiveTypeAccess(name()); 122 } 123 } 124 125 126