diff --git a/python/src/com/jetbrains/python/psi/types/PyTypeParser.java b/python/src/com/jetbrains/python/psi/types/PyTypeParser.java index f092da995b91..6d0584868f93 100644 --- a/python/src/com/jetbrains/python/psi/types/PyTypeParser.java +++ b/python/src/com/jetbrains/python/psi/types/PyTypeParser.java @@ -146,41 +146,35 @@ public class PyTypeParser { final FunctionalParser tupleType = op("(").skipThen(typeExpr).then(many(op(",").skipThen(typeExpr))).thenSkip(op(")")) - .map(new Function>, ParseResult>() { - @Override - public ParseResult fun(Pair> value) { - ParseResult result = value.getFirst(); - final List rest = value.getSecond(); - if (rest.isEmpty()) { - return result; - } - final List types = new ArrayList(); - types.add(result.getType()); - for (ParseResult r : rest) { - result = result.merge(r); - types.add(r.getType()); - } - return result.withType(PyTupleType.create(anchor, types.toArray(new PyType[types.size()]))); + .map(value -> { + ParseResult result = value.getFirst(); + final List rest = value.getSecond(); + if (rest.isEmpty()) { + return result; } + final List types = new ArrayList(); + types.add(result.getType()); + for (ParseResult r : rest) { + result = result.merge(r); + types.add(r.getType()); + } + return result.withType(PyTupleType.create(anchor, types.toArray(new PyType[types.size()]))); }) .named("tuple-type"); final FunctionalParser typeParameter = token(PARAMETER).then(maybe(op("<=").skipThen(typeExpr))) - .map(new Function, ParseResult>, ParseResult>() { - @Override - public ParseResult fun(Pair, ParseResult> value) { - final Token token = value.getFirst(); - final String name = token.getText().toString(); - final TextRange range = token.getRange(); - final ParseResult boundResult = value.getSecond(); - if (boundResult != null) { - final PyGenericType type = new PyGenericType(name, boundResult.getType()); - final ParseResult result = new ParseResult(null, type, range); - return result.merge(boundResult).withType(type); - } - return new ParseResult(null, new PyGenericType(name, null), range); + .map(value -> { + final Token token = value.getFirst(); + final String name = token.getText().toString(); + final TextRange range = token.getRange(); + final ParseResult boundResult = value.getSecond(); + if (boundResult != null) { + final PyGenericType type1 = new PyGenericType(name, boundResult.getType()); + final ParseResult result = new ParseResult(null, type1, range); + return result.merge(boundResult).withType(type1); } + return new ParseResult(null, new PyGenericType(name, null), range); }) .named("type-parameter"); @@ -192,102 +186,90 @@ public class PyTypeParser { final FunctionalParser paramExpr = classType.thenSkip(op("[")).then(typeExpr).then(many(op(",").skipThen(typeExpr))).thenSkip(op("]")) - .map(new Function, List>, ParseResult>() { - @Override - public ParseResult fun(Pair, List> value) { - final Pair firstPair = value.getFirst(); - final ParseResult first = firstPair.getFirst(); - final ParseResult second = firstPair.getSecond(); - final List third = value.getSecond(); - final PyType firstType = first.getType(); - final List typesInBrackets = new ArrayList(); - typesInBrackets.add(second.getType()); - ParseResult result = first; - result = result.merge(second); - for (ParseResult r : third) { - typesInBrackets.add(r.getType()); - result = result.merge(r); - } - final List elementTypes = third.isEmpty() ? Collections.singletonList(second.getType()) : typesInBrackets; - final PsiElement resolved = first.getElement(); - if (resolved != null) { - final PyType typingType = PyTypingTypeProvider.getType(resolved, elementTypes); - if (typingType != null) { - return result.withType(typingType); - } - } - if (firstType instanceof PyClassType) { - final PyType type = new PyCollectionTypeImpl(((PyClassType)firstType).getPyClass(), false, elementTypes); - return result.withType(type); - } - return EMPTY_RESULT; + .map(value -> { + final Pair firstPair = value.getFirst(); + final ParseResult first = firstPair.getFirst(); + final ParseResult second = firstPair.getSecond(); + final List third = value.getSecond(); + final PyType firstType = first.getType(); + final List typesInBrackets = new ArrayList(); + typesInBrackets.add(second.getType()); + ParseResult result = first; + result = result.merge(second); + for (ParseResult r : third) { + typesInBrackets.add(r.getType()); + result = result.merge(r); } + final List elementTypes = third.isEmpty() ? Collections.singletonList(second.getType()) : typesInBrackets; + final PsiElement resolved = first.getElement(); + if (resolved != null) { + final PyType typingType = PyTypingTypeProvider.getType(resolved, elementTypes); + if (typingType != null) { + return result.withType(typingType); + } + } + if (firstType instanceof PyClassType) { + final PyType type1 = new PyCollectionTypeImpl(((PyClassType)firstType).getPyClass(), false, elementTypes); + return result.withType(type1); + } + return EMPTY_RESULT; }) .or(classType.thenSkip(op("of")).then(simpleExpr) - .map(new Function, ParseResult>() { - @Override - public ParseResult fun(Pair value) { - final ParseResult firstResult = value.getFirst(); - final ParseResult secondResult = value.getSecond(); - final ParseResult result = firstResult.merge(secondResult); - final PyType firstType = firstResult.getType(); - final PyType secondType = secondResult.getType(); - if (firstType != null) { - if (firstType instanceof PyClassType && secondType != null) { - return result.withType(new PyCollectionTypeImpl(((PyClassType)firstType).getPyClass(), false, - Collections.singletonList(secondType))); - } - return result.withType(firstType); + .map(value -> { + final ParseResult firstResult = value.getFirst(); + final ParseResult secondResult = value.getSecond(); + final ParseResult result = firstResult.merge(secondResult); + final PyType firstType = firstResult.getType(); + final PyType secondType = secondResult.getType(); + if (firstType != null) { + if (firstType instanceof PyClassType && secondType != null) { + return result.withType(new PyCollectionTypeImpl(((PyClassType)firstType).getPyClass(), false, + Collections.singletonList(secondType))); } - return EMPTY_RESULT; + return result.withType(firstType); } + return EMPTY_RESULT; })) .or(classType.thenSkip(op("from")).then(simpleExpr).thenSkip(op("to")).then(simpleExpr) - .map(new Function, ParseResult>, ParseResult>() { - @Override - public ParseResult fun(Pair, ParseResult> value) { - final Pair firstPair = value.getFirst(); - final ParseResult first = firstPair.getFirst(); - final ParseResult second = firstPair.getSecond(); - final ParseResult third = value.getSecond(); - final PyType firstType = first.getType(); - if (firstType instanceof PyClassType) { - final List elementTypes = Arrays.asList(second.getType(), third.getType()); - final PyCollectionTypeImpl type = new PyCollectionTypeImpl(((PyClassType)firstType).getPyClass(), false, - elementTypes); - return first.merge(second).merge(third).withType(type); - } - return EMPTY_RESULT; + .map(value -> { + final Pair firstPair = value.getFirst(); + final ParseResult first = firstPair.getFirst(); + final ParseResult second = firstPair.getSecond(); + final ParseResult third = value.getSecond(); + final PyType firstType = first.getType(); + if (firstType instanceof PyClassType) { + final List elementTypes = Arrays.asList(second.getType(), third.getType()); + final PyCollectionTypeImpl type1 = new PyCollectionTypeImpl(((PyClassType)firstType).getPyClass(), false, + elementTypes); + return first.merge(second).merge(third).withType(type1); } + return EMPTY_RESULT; })) .named("param-expr"); final FunctionalParser callableExpr = op("(").skipThen(maybe(typeExpr.then(many(op(",").skipThen(typeExpr))))).thenSkip(op(")")).thenSkip(op("->")).then(typeExpr) .map( - new Function>, ParseResult>, ParseResult>() { - @Override - public ParseResult fun(Pair>, ParseResult> value) { - final List parameters = new ArrayList(); - final ParseResult returnResult = value.getSecond(); - ParseResult result; - final Pair> firstPair = value.getFirst(); - if (firstPair != null) { - final ParseResult first = firstPair.getFirst(); - final List second = firstPair.getSecond(); - result = first; - parameters.add(new PyCallableParameterImpl(null, first.getType())); - for (ParseResult r : second) { - result = result.merge(r); - parameters.add(new PyCallableParameterImpl(null, r.getType())); - } - result = result.merge(returnResult); + value -> { + final List parameters = new ArrayList(); + final ParseResult returnResult = value.getSecond(); + ParseResult result; + final Pair> firstPair = value.getFirst(); + if (firstPair != null) { + final ParseResult first = firstPair.getFirst(); + final List second = firstPair.getSecond(); + result = first; + parameters.add(new PyCallableParameterImpl(null, first.getType())); + for (ParseResult r : second) { + result = result.merge(r); + parameters.add(new PyCallableParameterImpl(null, r.getType())); } - else { - result = returnResult; - } - return result.withType(new PyCallableTypeImpl(parameters, returnResult.getType())); + result = result.merge(returnResult); } + else { + result = returnResult; + } + return result.withType(new PyCallableTypeImpl(parameters, returnResult.getType())); }) .named("callable-expr"); @@ -299,23 +281,20 @@ public class PyTypeParser { final FunctionalParser unionExpr = singleExpr.then(many(op("or").or(op("|")).skipThen(singleExpr))) - .map(new Function>, ParseResult>() { - @Override - public ParseResult fun(Pair> value) { - final ParseResult first = value.getFirst(); - final List rest = value.getSecond(); - if (rest.isEmpty()) { - return first; - } - final List types = new ArrayList(); - types.add(first.getType()); - ParseResult result = first; - for (ParseResult r : rest) { - types.add(r.getType()); - result = result.merge(r); - } - return result.withType(PyUnionType.union(types)); + .map(value -> { + final ParseResult first = value.getFirst(); + final List rest = value.getSecond(); + if (rest.isEmpty()) { + return first; } + final List types = new ArrayList(); + types.add(first.getType()); + ParseResult result = first; + for (ParseResult r : rest) { + types.add(r.getType()); + result = result.merge(r); + } + return result.withType(PyUnionType.union(types)); }) .named("union-expr"); @@ -348,31 +327,28 @@ public class PyTypeParser { final FunctionalParser paramExpr = classType.thenSkip(op("[")).then(typeExpr).then(many(op(",").skipThen(typeExpr))).thenSkip(op("]")) - .map(new Function, List>, ParseResult>() { - @Override - public ParseResult fun(Pair, List> value) { - final Pair firstPair = value.getFirst(); - final ParseResult first = firstPair.getFirst(); - final ParseResult second = firstPair.getSecond(); - final List third = value.getSecond(); - final List typesInBrackets = new ArrayList(); - typesInBrackets.add(second.getType()); - ParseResult result = first; - result = result.merge(second); - for (ParseResult r : third) { - typesInBrackets.add(r.getType()); - result = result.merge(r); - } - final List elementTypes = third.isEmpty() ? Collections.singletonList(second.getType()) : typesInBrackets; - final PsiElement resolved = first.getElement(); - if (resolved != null) { - final PyType typingType = PyTypingTypeProvider.getType(resolved, elementTypes); - if (typingType != null) { - return result.withType(typingType); - } - } - return EMPTY_RESULT; + .map(value -> { + final Pair firstPair = value.getFirst(); + final ParseResult first = firstPair.getFirst(); + final ParseResult second = firstPair.getSecond(); + final List third = value.getSecond(); + final List typesInBrackets = new ArrayList(); + typesInBrackets.add(second.getType()); + ParseResult result = first; + result = result.merge(second); + for (ParseResult r : third) { + typesInBrackets.add(r.getType()); + result = result.merge(r); } + final List elementTypes = third.isEmpty() ? Collections.singletonList(second.getType()) : typesInBrackets; + final PsiElement resolved = first.getElement(); + if (resolved != null) { + final PyType typingType = PyTypingTypeProvider.getType(resolved, elementTypes); + if (typingType != null) { + return result.withType(typingType); + } + } + return EMPTY_RESULT; }) .named("param-expr"); @@ -387,69 +363,63 @@ public class PyTypeParser { final FunctionalParser argExpr = maybe(op("*")).then(maybe(op("*"))).then(typeExpr) - .map(new Function, Token>, ParseResult>, ParseResult>() { - @Override - public ParseResult fun(Pair, Token>, ParseResult> pair) { - final ParseResult paramResult = pair.getSecond(); - final PyType paramType = paramResult.getType(); - int starCount = 0; - if (pair.getFirst().getFirst() != null) { - starCount++; - } - if (pair.getFirst().getSecond() != null) { - starCount++; - } - if (starCount == 0) { - return paramResult; - } - else if (starCount == 1) { - final PyClassType tupleType = PyBuiltinCache.getInstance(anchor).getTupleType();; - // TODO How to represent unbound homogeneous tuple? - if (tupleType != null) { - return paramResult.withType(tupleType); - } - return EMPTY_RESULT; - } - else if (starCount == 2) { - final PyBuiltinCache builtinCache = PyBuiltinCache.getInstance(anchor); - final PyClassType type = builtinCache.getDictType(); - if (type != null) { - final PyClass pyClass = type.getPyClass(); - return paramResult.withType(new PyCollectionTypeImpl(pyClass, false, - Arrays.asList(builtinCache.getStrType(), paramType))); - } - return EMPTY_RESULT; + .map(pair -> { + final ParseResult paramResult = pair.getSecond(); + final PyType paramType = paramResult.getType(); + int starCount = 0; + if (pair.getFirst().getFirst() != null) { + starCount++; + } + if (pair.getFirst().getSecond() != null) { + starCount++; + } + if (starCount == 0) { + return paramResult; + } + else if (starCount == 1) { + final PyClassType tupleType = PyBuiltinCache.getInstance(anchor).getTupleType();; + // TODO How to represent unbound homogeneous tuple? + if (tupleType != null) { + return paramResult.withType(tupleType); } return EMPTY_RESULT; } + else if (starCount == 2) { + final PyBuiltinCache builtinCache = PyBuiltinCache.getInstance(anchor); + final PyClassType type = builtinCache.getDictType(); + if (type != null) { + final PyClass pyClass = type.getPyClass(); + return paramResult.withType(new PyCollectionTypeImpl(pyClass, false, + Arrays.asList(builtinCache.getStrType(), paramType))); + } + return EMPTY_RESULT; + } + return EMPTY_RESULT; }) .named("param-expr"); final FunctionalParser funcExpr = op("(").skipThen(maybe(argExpr.then(many(op(",").skipThen(argExpr))))).thenSkip(op(")")).thenSkip(op("->")).then(typeExpr) - .map(new Function>, ParseResult>, ParseResult>() { - @Override - public ParseResult fun(Pair>, ParseResult> value) { - final List parameters = new ArrayList(); - final ParseResult returnResult = value.getSecond(); - ParseResult result; - final Pair> firstPair = value.getFirst(); - if (firstPair != null) { - final ParseResult first = firstPair.getFirst(); - final List second = firstPair.getSecond(); - result = first; - parameters.add(new PyCallableParameterImpl(null, first.getType())); - for (ParseResult r : second) { - result = result.merge(r); - parameters.add(new PyCallableParameterImpl(null, r.getType())); - } - result = result.merge(returnResult); + .map(value -> { + final List parameters = new ArrayList(); + final ParseResult returnResult = value.getSecond(); + ParseResult result; + final Pair> firstPair = value.getFirst(); + if (firstPair != null) { + final ParseResult first = firstPair.getFirst(); + final List second = firstPair.getSecond(); + result = first; + parameters.add(new PyCallableParameterImpl(null, first.getType())); + for (ParseResult r : second) { + result = result.merge(r); + parameters.add(new PyCallableParameterImpl(null, r.getType())); } - else { - result = returnResult; - } - return result.withType(new PyCallableTypeImpl(parameters, returnResult.getType())); + result = result.merge(returnResult); } + else { + result = returnResult; + } + return result.withType(new PyCallableTypeImpl(parameters, returnResult.getType())); }) .named("func-expr");