private boolean typeUsesTypeVariable(TypeBinding type, TypeBinding variable) { if (TypeBinding.equalsEquals(type.leafComponentType(), variable)) return true; for (TypeVariableBinding t : type.typeVariables()) if (typeUsesTypeVariable(t, variable)) return true; if (type.isTypeVariable()) { if (typeUsesTypeVariable(((ReferenceBinding) type).superclass(), variable)) return true; for (TypeBinding superIfc : ((ReferenceBinding) type).superInterfaces()) if (typeUsesTypeVariable(superIfc, variable)) return true; } return false; }
public boolean canUseDiamond(String[] parameterTypes, char[] fullyQualifiedTypeName) { TypeBinding guessedType = null; char[][] cn = CharOperation.splitOn('.', fullyQualifiedTypeName); Scope scope = this.assistScope; if (scope.compilerOptions().sourceLevel < ClassFileConstants.JDK1_7) return false; // If no LHS or return type expected, then we can safely use diamond char[][] expectedTypekeys = this.completionContext.getExpectedTypesKeys(); if (expectedTypekeys == null || expectedTypekeys.length == 0) return true; // Next, find out whether any of the constructor parameters are the same as one of the // class type variables. If yes, diamond cannot be used. TypeReference ref; if (cn.length == 1) { ref = new SingleTypeReference(cn[0], 0); } else { ref = new QualifiedTypeReference(cn, new long[cn.length]); } // {ObjectTeams: protect call into the compiler try (Config config = Dependencies.setup(this, this.parser, this.lookupEnvironment, true, true)) { // orig: switch (scope.kind) { case Scope.METHOD_SCOPE: case Scope.BLOCK_SCOPE: guessedType = ref.resolveType((BlockScope) scope); break; case Scope.CLASS_SCOPE: guessedType = ref.resolveType((ClassScope) scope); break; } // :giro } // SH} if (guessedType != null && guessedType.isValidBinding()) { // the erasure must be used because guessedType can be a RawTypeBinding guessedType = guessedType.erasure(); TypeVariableBinding[] typeVars = guessedType.typeVariables(); for (int i = 0; i < parameterTypes.length; i++) { for (int j = 0; j < typeVars.length; j++) { if (CharOperation.equals(parameterTypes[i].toCharArray(), typeVars[j].sourceName)) return false; } } return true; } return false; }