/** * JLS8 4.9 Intersection types */ private JavaType intersectionType(JavaType type, Set<JavaType> interfaces, Tree tree) { if (interfaces.isEmpty()) { return type; } List<String> names = new ArrayList<>(); names.add(type.name()); names.addAll(interfaces.stream().map(JavaType::name).collect(Collectors.toSet())); JavaSymbol.TypeJavaSymbol typeJavaSymbol = new JavaSymbol.TypeJavaSymbol(0, "<intersectionType of "+names.stream().collect(Collectors.joining(" & ")) + ">", semanticModel.getEnv(tree).packge); typeJavaSymbol.members = new Scope(typeJavaSymbol); IntersectionType intersectionType = new IntersectionType(typeJavaSymbol); typeJavaSymbol.type = intersectionType; Set<JavaType> superInterfaces = new HashSet<>(interfaces); if(type.symbol.isInterface()) { superInterfaces.add(type); intersectionType.supertype = symbols.objectType; } else { intersectionType.supertype = type; } intersectionType.interfaces = ImmutableList.<JavaType>builder().addAll(superInterfaces).build(); return intersectionType; }
/** * JLS8 4.9 Intersection types */ private JavaType intersectionType(JavaType type, Set<JavaType> interfaces, Tree tree) { if (interfaces.isEmpty()) { return type; } List<String> names = new ArrayList<>(); names.add(type.name()); names.addAll(interfaces.stream().map(JavaType::name).collect(Collectors.toSet())); JavaSymbol.TypeJavaSymbol typeJavaSymbol = new JavaSymbol.TypeJavaSymbol(0, "<intersectionType of "+names.stream().collect(Collectors.joining(" & ")) + ">", semanticModel.getEnv(tree).packge); typeJavaSymbol.members = new Scope(typeJavaSymbol); IntersectionType intersectionType = new IntersectionType(typeJavaSymbol); typeJavaSymbol.type = intersectionType; Set<JavaType> superInterfaces = new HashSet<>(interfaces); if(type.symbol.isInterface()) { superInterfaces.add(type); intersectionType.supertype = symbols.objectType; } else { intersectionType.supertype = type; } intersectionType.interfaces = ImmutableList.<JavaType>builder().addAll(superInterfaces).build(); return intersectionType; }
private static Optional<String> expectedTypeInsteadOfOptional(Type type) { if (type.is(JAVA_UTIL_OPTIONAL)) { String msg; if (((JavaType) type).isParameterized()) { ParametrizedTypeJavaType ptjt = (ParametrizedTypeJavaType) type; String parameterTypeName = ptjt.substitution(ptjt.typeParameters().get(0)).erasure().name(); msg = formatMsg(parameterTypeName); } else { msg = "Specify a type instead."; } return Optional.of(msg); } return PRIMITIVE_OPTIONALS.stream() .filter(type::is) .findFirst() .map(optional -> formatMsg(optional.substring(JAVA_UTIL_OPTIONAL.length()).toLowerCase())); }
private static Optional<String> expectedTypeInsteadOfOptional(Type type) { if (type.is(JAVA_UTIL_OPTIONAL)) { String msg; if (((JavaType) type).isParameterized()) { ParametrizedTypeJavaType ptjt = (ParametrizedTypeJavaType) type; String parameterTypeName = ptjt.substitution(ptjt.typeParameters().get(0)).erasure().name(); msg = formatMsg(parameterTypeName); } else { msg = "Specify a type instead."; } return Optional.of(msg); } return PRIMITIVE_OPTIONALS.stream() .filter(type::is) .findFirst() .map(optional -> formatMsg(optional.substring(JAVA_UTIL_OPTIONAL.length()).toLowerCase())); }