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