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 GenericsParTypeDecl { 011 012 eq ParTypeDecl.fullName() { 013 if(isNestedType()) 014 return enclosingType().fullName() + "." + nameWithArgs(); 015 String packageName = packageName(); 016 if(packageName.equals("")) 017 return nameWithArgs(); 018 return packageName + "." + nameWithArgs(); 019 } 020 021 eq ParTypeDecl.typeName() { 022 if(isNestedType()) 023 return enclosingType().typeName() + "." + nameWithArgs(); 024 String packageName = packageName(); 025 if(packageName.equals("") || packageName.equals(PRIMITIVE_PACKAGE_NAME)) 026 return nameWithArgs(); 027 return packageName + "." + nameWithArgs(); 028 } 029 030 syn String ParTypeDecl.nameWithArgs() { 031 StringBuffer s = new StringBuffer(); 032 s.append(name()); 033 s.append("<"); 034 for(int i = 0; i < getNumArgument(); i++) { 035 if(i != 0) 036 s.append(", "); 037 s.append(getArgument(i).type().fullName()); 038 } 039 s.append(">"); 040 return s.toString(); 041 } 042 eq RawClassDecl.nameWithArgs() = name(); 043 eq RawInterfaceDecl.nameWithArgs() = name(); 044 045 inh lazy TypeDecl ParTypeDecl.genericDecl(); 046 eq Program.getChild().genericDecl() = null; 047 // ES: Changing inheritance a bit to include any child i.e., also syn nta(param)'s 048 // eq GenericClassDecl.getParTypeDecl().genericDecl() = this; 049 // eq GenericInterfaceDecl.getParTypeDecl().genericDecl() = this; 050 eq GenericClassDecl.getChild().genericDecl() = this; 051 eq GenericInterfaceDecl.getChild().genericDecl() = this; 052 eq ParClassDecl.getBodyDecl(int index).genericDecl() { 053 if(getBodyDecl(index) instanceof MemberTypeDecl) { 054 MemberTypeDecl m = (MemberTypeDecl)getBodyDecl(index); 055 return extractSingleType(genericDecl().memberTypes(m.typeDecl().name())); 056 } 057 return genericDecl(); 058 } 059 eq ParInterfaceDecl.getBodyDecl(int index).genericDecl() { 060 if(getBodyDecl(index) instanceof MemberTypeDecl) { 061 MemberTypeDecl m = (MemberTypeDecl)getBodyDecl(index); 062 return extractSingleType(genericDecl().memberTypes(m.typeDecl().name())); 063 } 064 return genericDecl(); 065 } 066 067 syn boolean BodyDecl.visibleTypeParameters() = true; 068 eq MethodDecl.visibleTypeParameters() = !isStatic(); 069 eq FieldDeclaration.visibleTypeParameters() = !isStatic(); 070 eq StaticInitializer.visibleTypeParameters() = false; 071 eq MemberTypeDecl.visibleTypeParameters() = !isStatic(); 072 073 syn boolean TypeDecl.isTypeVariable() = false; 074 eq TypeVariable.isTypeVariable() = true; 075 076 public Access ParTypeDecl.createQualifiedAccess() { 077 List typeArgumentList = new List(); 078 for(int i = 0; i < getNumArgument(); i++) { 079 Access a = (Access)getArgument(i); 080 if(a instanceof TypeAccess) 081 typeArgumentList.add(a.type().createQualifiedAccess()); 082 else 083 typeArgumentList.add(a.fullCopy()); 084 } 085 if(!isTopLevelType()) { 086 if(isRawType()) 087 return enclosingType().createQualifiedAccess().qualifiesAccess( 088 new TypeAccess("", getID()) 089 ); 090 else 091 return enclosingType().createQualifiedAccess().qualifiesAccess( 092 new ParTypeAccess(new TypeAccess("", getID()), typeArgumentList) 093 ); 094 } 095 else { 096 if(isRawType()) 097 return new TypeAccess(packageName(), getID()); 098 else 099 return new ParTypeAccess(new TypeAccess(packageName(), getID()), typeArgumentList); 100 } 101 } 102 } 103