if (dim != 0) type = TypeX.makeArray(type, dim);
	public TypePattern resolveBindings(IScope scope, Bindings bindings, boolean allowBinding) {		if (isStar()) {			return TypePattern.ANY;  //??? loses source location		}		String simpleName = maybeGetSimpleName();		if (simpleName != null) {			FormalBinding formalBinding = scope.lookupFormal(simpleName);			if (formalBinding != null) {				if (!allowBinding || bindings == null) {					scope.message(IMessage.ERROR, this, "negation doesn't allow binding");					return this;				}				BindingTypePattern binding = new BindingTypePattern(formalBinding);				binding.copyLocationFrom(this);				bindings.register(binding, scope);								return binding;			}		}				String cleanName = maybeGetCleanName();		if (cleanName != null) {			TypeX type;						//System.out.println("resolve: " + cleanName);			//??? this loop has too many inefficiencies to count			while ((type = scope.lookupType(cleanName, this)) == ResolvedTypeX.MISSING) {				int lastDot = cleanName.lastIndexOf('.');				if (lastDot == -1) break;				cleanName = cleanName.substring(0, lastDot) + '$' + cleanName.substring(lastDot+1);			}			if (type == ResolvedTypeX.MISSING) {				if (scope.getWorld().getLint().invalidAbsoluteTypeName.isEnabled()) {					scope.getWorld().getLint().invalidAbsoluteTypeName.signal(cleanName, getSourceLocation());				}			} else {				TypePattern ret = new ExactTypePattern(type, includeSubtypes);				ret.copyLocationFrom(this);				return ret;			}		} else {			//XXX need to implement behavior for Lint.invalidWildcardTypeName		}				importedPrefixes = scope.getImportedPrefixes();		knownMatches = preMatch(scope.getImportedNames());				return this;	}