All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.aspectj.ajdt.internal.compiler.lookup.InterTypeScope Maven / Gradle / Ivy

There is a newer version: 1.9.22.1
Show newest version
/* *******************************************************************
 * Copyright (c) 2002 Palo Alto Research Center, Incorporated (PARC).
 * All rights reserved. 
 * This program and the accompanying materials are made available 
 * under the terms of the Eclipse Public License v1.0 
 * which accompanies this distribution and is available at 
 * http://www.eclipse.org/legal/epl-v10.html 
 *  
 * Contributors: 
 *     PARC     initial implementation 
 * ******************************************************************/


package org.aspectj.ajdt.internal.compiler.lookup;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;
import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ClassScope;
import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.PackageBinding;
import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ParameterizedTypeBinding;
import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ProblemReferenceBinding;
import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding;
import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Scope;
import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding;
import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeVariableBinding;
import org.aspectj.weaver.BCException;

public class InterTypeScope extends ClassScope {
	ReferenceBinding onType;
	List aliases;
	Map /* real type variable > alias letter */ usedAliases; // Used later when reconstructing the resolved member

	public InterTypeScope(Scope parent, ReferenceBinding onType) {
		super(parent, null);
		referenceContext = new TypeDeclaration(null);
		referenceContext.binding = makeSourceTypeBinding(onType);
		this.onType = onType;
	}

	public InterTypeScope(Scope parent, ReferenceBinding rb, List list) {
		this(parent,rb);
		this.aliases = list;
	}
	
	public String getAnyAliasForTypeVariableBinding(TypeVariableBinding tvb) {
		if (usedAliases==null) return null;
		return (String)usedAliases.get(tvb);
	}

	// this method depends on the fact that BinaryTypeBinding extends SourceTypeBinding
	private SourceTypeBinding makeSourceTypeBinding(ReferenceBinding onType) {
		if (onType instanceof SourceTypeBinding) return (SourceTypeBinding)onType;
		else if (onType instanceof ParameterizedTypeBinding) {
			ReferenceBinding rb = ((ParameterizedTypeBinding)onType).type;
			if (rb instanceof SourceTypeBinding) return (SourceTypeBinding)rb;
			else throw new BCException("In parameterized type "+onType+", can't handle reference binding "+rb);
		} else if (onType instanceof ProblemReferenceBinding) { 
			return null;
		} else if (onType instanceof TypeVariableBinding) {
			// Problem will have already been reported, cant ITD on a type variable.
			return null;
		}
		
		throw new BCException("can't handle: " + onType);
	}

	public SourceTypeBinding invocationType() {
		return parent.enclosingSourceType();
	}
	
	public int addDepth() {
		return 0;
	}
	

	public TypeVariableBinding findTypeVariable(char[] name, SourceTypeBinding sourceType) {
		String variableName = new String(name);
		int aliased = (aliases==null?-1:aliases.indexOf(variableName));
		if (aliased!=-1) {
			if (aliased>sourceType.typeVariables.length || sourceType.typeVariables.length==0) {
				TypeVariableBinding tvb = new TypeVariableBinding("fake".toCharArray(),null,0);
				tvb.superclass = getJavaLangObject();
				tvb.fPackage = new PackageBinding(environment());
				return tvb;
				// error is going to be reported by someone else!
			}
			TypeVariableBinding tvb = sourceType.typeVariables()[aliased];
			tvb.fPackage = sourceType.fPackage;
			if (usedAliases==null) usedAliases = new HashMap();
			usedAliases.put(tvb,variableName);
			return tvb;
		} else {
		    TypeVariableBinding variableBinding = sourceType.getTypeVariable(name);
		    if (variableBinding == null) { // GENERICITDFIX
		    	// Inside generic aspect, might want the type var attached to us
		    	variableBinding = parent.findTypeVariable(name,((ClassScope) parent).referenceContext.binding);
		    }
		    return variableBinding;
		}
	}

	public Map getRecoveryAliases() {
		return usedAliases;
	}
	

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy