/* ******************************************************************* * 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 Common Public License v1.0 * which accompanies this distribution and is available at * http://www.eclipse.org/legal/cpl-v10.html * * Contributors: * PARC initial implementation * ******************************************************************/ package org.aspectj.ajdt.internal.compiler.lookup; import java.util.*; import org.aspectj.ajdt.internal.compiler.ast.AspectDeclaration; import org.aspectj.ajdt.internal.compiler.ast.AstUtil; import org.aspectj.ajdt.internal.core.builder.AjBuildManager; import org.aspectj.ajdt.internal.core.builder.AsmBuilder; import org.aspectj.bridge.ISourceLocation; import org.aspectj.bridge.IMessage.Kind; import org.aspectj.weaver.*; import org.eclipse.jdt.internal.compiler.ast.*; import org.eclipse.jdt.internal.compiler.impl.Constant; import org.eclipse.jdt.internal.compiler.impl.ReferenceContext; import org.eclipse.jdt.internal.compiler.lookup.*; import org.eclipse.jdt.internal.compiler.util.CharOperation; /** * * @author Jim Hugunin */ public class EclipseFactory { public static boolean DEBUG = false; public AjBuildManager buildManager; private LookupEnvironment lookupEnvironment; private Map/*TypeX, TypeBinding*/ typexToBinding = new HashMap(); //XXX currently unused private Map/*TypeBinding, ResolvedTypeX*/ bindingToResolvedTypeX = new HashMap(); public static EclipseFactory fromLookupEnvironment(LookupEnvironment env) { AjLookupEnvironment aenv = (AjLookupEnvironment)env; return aenv.factory; } public static EclipseFactory fromScopeLookupEnvironment(Scope scope) { return fromLookupEnvironment(AstUtil.getCompilationUnitScope(scope).environment); } public EclipseFactory(LookupEnvironment lookupEnvironment) { this.lookupEnvironment = lookupEnvironment; } public World getWorld() { return buildManager.getWorld(); } public void showMessage( Kind kind, String message, ISourceLocation loc1, ISourceLocation loc2) { getWorld().showMessage(kind, message, loc1, loc2); } public ResolvedTypeX fromEclipse(ReferenceBinding binding) { if (binding == null) return ResolvedTypeX.MISSING; //??? this seems terribly inefficient //System.err.println("resolving: " + binding.getClass() + ", name = " + getName(binding)); ResolvedTypeX ret = getWorld().resolve(fromBinding(binding)); //System.err.println(" got: " + ret); return ret; } public ResolvedTypeX[] fromEclipse(ReferenceBinding[] bindings) { if (bindings == null) { return ResolvedTypeX.NONE; } int len = bindings.length; ResolvedTypeX[] ret = new ResolvedTypeX[len]; for (int i=0; i < len; i++) { ret[i] = fromEclipse(bindings[i]); } return ret; } private static String getName(TypeBinding binding) { String packageName = new String(binding.qualifiedPackageName()); String className = new String(binding.qualifiedSourceName()).replace('.', '$'); if (packageName.length() > 0) { className = packageName + "." + className; } //XXX doesn't handle arrays correctly (or primitives?) return new String(className); } //??? going back and forth between strings and bindings is a waste of cycles public static TypeX fromBinding(TypeBinding binding) { if (binding instanceof HelperInterfaceBinding) { return ((HelperInterfaceBinding) binding).getTypeX(); } if (binding == null || binding.qualifiedSourceName() == null) { return ResolvedTypeX.MISSING; } return TypeX.forName(getName(binding)); } public static TypeX[] fromBindings(TypeBinding[] bindings) { if (bindings == null) return TypeX.NONE; int len = bindings.length; TypeX[] ret = new TypeX[len]; for (int i=0; i