Example usage for org.eclipse.jdt.internal.compiler.lookup Scope getJavaLangString

List of usage examples for org.eclipse.jdt.internal.compiler.lookup Scope getJavaLangString

Introduction

In this page you can find the example usage for org.eclipse.jdt.internal.compiler.lookup Scope getJavaLangString.

Prototype

public final ReferenceBinding getJavaLangString() 

Source Link

Usage

From source file:org.eclipse.objectteams.otdt.internal.core.compiler.lifting.Lifting.java

License:Open Source License

/**
* API for AbstractMethodDeclaration:/*  ww w .j a  v a2s .  c o m*/
*
 *  Create a byte code sequence for a runtime check in a creation method:
 *  R _OT$create_OT$R(B b) {
 *       if (this._OT$cache_OT$R.contains(b))
 *       throw new DuplicateRoleException("R");
 *     // continue regular code.
 *  }
 *
 * Note, the need for this runtime check is detected quite late.
 * At this point it is easier to create the byte code sequence directly,
 * rather the creating AST first.
 */
public static void createDuplicateRoleCheck(CodeStream codeStream, AbstractMethodDeclaration method) {
    MethodBinding binding = method.binding;
    Scope scope = method.scope;

    ReferenceBinding roleType = (ReferenceBinding) binding.returnType;
    String roleName = new String(roleType.readableName());
    // TODO(SH): check why roleType.getRoleModel().getClassPartBinding().roleModel may yield a different result.
    // I think it occured in haeder/stopwatch from smile-CVS.
    //RoleModel role = roleType.getRealClass().roleModel;
    char[] cacheName = LiftingEnvironment.getCacheName(roleType.roleModel.getBoundRootRole());

    ReferenceBinding teamBinding = roleType.enclosingType();//role.getTeamModel().getBinding();
    FieldBinding cache = TypeAnalyzer.findField(teamBinding, cacheName, /*static*/false, /*outer*/false,
            ITranslationStates.STATE_FULL_LIFTING); // generated by this state
    if (cache == null)
        throw new InternalCompilerError("generated cache field not found: " + new String(cacheName)); //$NON-NLS-1$
    ReferenceBinding map = (ReferenceBinding) scope.getType(IOTConstants.WEAK_HASH_MAP, 3);
    MethodBinding contains = map.getMethod(scope, IOTConstants.CONTAINS_KEY);

    ReferenceBinding exc = (ReferenceBinding) scope.getType(IOTConstants.ORG_OBJECTTEAMS_DUPLICATE_ROLE, 3);
    TypeBinding[] types = new TypeBinding[] { scope.getJavaLangString() };
    MethodBinding excInit = exc.getExactConstructor(types);

    BranchLabel normalCase = new BranchLabel(codeStream);

    codeStream.aload_0(); // this
    codeStream.fieldAccess(Opcodes.OPC_getfield, cache, teamBinding); // getfield      MyTeam._OT$cache_OT$R Ljava/util/WeakHashMap;
    codeStream.aload_1(); // arg0
    codeStream.invoke(Opcodes.OPC_invokevirtual, contains, map); // invokevirtual java.util.WeakHashMap.containsKey (Ljava/lang/Object;)Z
    codeStream.ifeq(normalCase); // false -> #endif
    codeStream.new_(exc); // new           <org.objectteams.DuplicateRoleException>
    codeStream.dup(); // dup
    codeStream.ldc(roleName); // ldc "R"
    codeStream.invoke(Opcodes.OPC_invokespecial, excInit, exc); // invokespecial org.objectteams.DuplicateRoleException.<init> (Ljava/lang/String;)V
    codeStream.athrow(); // athrow
    normalCase.place(); // #endif
}

From source file:org.eclipse.objectteams.otdt.internal.core.compiler.lookup.SyntheticBaseCallSurrogate.java

License:Open Source License

/**
 * Create a binding for a synthetic base-call surrogate.
 * /*from  ww w .  j a  v a  2  s.  com*/
 * @param callinMethod   the callin method potentially holding base-calls 
 * @param declaringClass the class that will hold the surrogate implementation: normally the role, for static callin methods: the team.
 */
public SyntheticBaseCallSurrogate(MethodBinding callinMethod, SourceTypeBinding declaringClass) {
    super(declaringClass, ClassFileConstants.AccProtected | ClassFileConstants.AccSynthetic,
            callinMethod.selector, callinMethod.parameters, callinMethod.returnType);
    this.selector = SyntheticBaseCallSurrogate.genSurrogateName(callinMethod.selector,
            callinMethod.declaringClass.sourceName(), callinMethod.isStatic());
    if (!callinMethod.isStatic() && callinMethod.isCallin()) { // don't change paramaters if enhancement is absent
        // additional arg "boolean isSuperAccess":
        this.parameters = addIsSuperAccessArg(this.parameters,
                declaringClass.scope.compilerOptions().weavingScheme);
    }
    this.purpose = MethodAccess;
    this.targetMethod = callinMethod;
    TypeBinding origReturnType = MethodModel.getReturnType(callinMethod);
    MethodModel.saveReturnType(this, origReturnType);
    // fetch type bindings while we have a scope:
    Scope scope = declaringClass.scope;
    this.errorType = scope.getType(IOTConstants.OTRE_INTERNAL_ERROR, 3);
    this.stringType = scope.getJavaLangString();
    // the synthetic methods of a class will be sorted according to a per-class index, find the index now: 
    SyntheticMethodBinding[] knownAccessMethods = declaringClass.syntheticMethods();
    this.index = knownAccessMethods == null ? 0 : knownAccessMethods.length;
    this.sourceStart = declaringClass.scope.referenceContext.sourceStart;
    retrieveLineNumber(declaringClass);
}