Introduce static-factory methods to PyCallableParameterImpl to avoid ambiguous PyCallableParameterImpl.new calls.

This commit is contained in:
Semyon Proshev
2017-06-20 13:35:08 +03:00
parent dbff481450
commit 089ff65959
13 changed files with 49 additions and 39 deletions
@@ -340,7 +340,7 @@ public class PyParameterInfoHandler implements ParameterInfoHandler<PyArgumentLi
final List<PyCallableParameter> results = new ArrayList<>();
for (PyParameter component : parameter.getContents()) {
if (component instanceof PyNamedParameter) {
results.add(new PyCallableParameterImpl(component));
results.add(PyCallableParameterImpl.psi(component));
}
else if (component instanceof PyTupleParameter) {
results.addAll(getFlattenedTupleParameterComponents((PyTupleParameter)component));
@@ -392,7 +392,7 @@ public class PyParameterInfoHandler implements ParameterInfoHandler<PyArgumentLi
@Override
public void visitNamedParameter(PyNamedParameter param, boolean first, boolean last) {
visitNonPsiParameter(new PyCallableParameterImpl(param), first, last);
visitNonPsiParameter(PyCallableParameterImpl.psi(param), first, last);
}
@Override
@@ -168,7 +168,7 @@ public class PyNamedTupleType extends PyClassTypeImpl implements PyCallableType
@NotNull
private static PyCallableParameter fieldToCallableParameter(@NotNull String name, @NotNull FieldTypeAndDefaultValue typeAndDefaultValue) {
return new PyCallableParameterImpl(name, typeAndDefaultValue.getType(), typeAndDefaultValue.getDefaultValue());
return PyCallableParameterImpl.nonPsi(name, typeAndDefaultValue.getType(), typeAndDefaultValue.getDefaultValue());
}
public enum DefinitionLevel {
@@ -647,7 +647,7 @@ public class PyTypingTypeProvider extends PyTypeProviderBase {
final List<PyCallableParameter> parameters = new ArrayList<>();
final PyListLiteralExpression listExpr = (PyListLiteralExpression)parametersExpr;
for (PyExpression argExpr : listExpr.getElements()) {
parameters.add(new PyCallableParameterImpl(null, Ref.deref(getType(argExpr, context))));
parameters.add(PyCallableParameterImpl.nonPsi(Ref.deref(getType(argExpr, context))));
}
final PyType returnType = Ref.deref(getType(returnTypeExpr, context));
return new PyCallableTypeImpl(parameters, returnType);
@@ -53,7 +53,7 @@ public class PyRemoveParameterQuickFix implements LocalQuickFix {
public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) {
final PyParameter psi = PyUtil.as(descriptor.getPsiElement(), PyParameter.class);
assert psi != null;
final PyCallableParameter parameter = new PyCallableParameterImpl(psi);
final PyCallableParameter parameter = PyCallableParameterImpl.psi(psi);
final PyFunction function = PsiTreeUtil.getParentOfType(psi, PyFunction.class);
if (function != null) {
@@ -41,7 +41,7 @@ public class ParamHelper {
* @param walker the walker with callbacks.
*/
public static void walkDownParamArray(PyParameter[] params, ParamWalker walker) {
walkDownParameters(ContainerUtil.map(params, PyCallableParameterImpl::new), walker);
walkDownParameters(ContainerUtil.map(params, PyCallableParameterImpl::psi), walker);
}
public static void walkDownParameters(@NotNull List<PyCallableParameter> parameters, @NotNull ParamWalker walker) {
@@ -74,7 +74,7 @@ public class ParamHelper {
public static String getPresentableText(@NotNull PyParameter[] parameters,
boolean includeDefaultValue,
@Nullable TypeEvalContext context) {
return getPresentableText(ContainerUtil.map(parameters, PyCallableParameterImpl::new), includeDefaultValue, context);
return getPresentableText(ContainerUtil.map(parameters, PyCallableParameterImpl::psi), includeDefaultValue, context);
}
@NotNull
@@ -100,7 +100,7 @@ public class ParamHelper {
@Override
public void visitNamedParameter(PyNamedParameter param, boolean first, boolean last) {
visitNonPsiParameter(new PyCallableParameterImpl(param), first, last);
visitNonPsiParameter(PyCallableParameterImpl.psi(param), first, last);
}
@Override
@@ -1101,7 +1101,7 @@ public class PyCallExpressionHelper {
final PyExpression arg = argumentComponents[i];
if (arg != null) {
if (param instanceof PyNamedParameter) {
mappedParameters.put(arg, new PyCallableParameterImpl(param));
mappedParameters.put(arg, PyCallableParameterImpl.psi(param));
}
else if (param instanceof PyTupleParameter) {
final TupleMappingResults nestedResults = mapComponentsOfTupleParameter(arg, (PyTupleParameter)param);
@@ -1114,11 +1114,11 @@ public class PyCallExpressionHelper {
}
}
else {
unmappedParameters.add(new PyCallableParameterImpl(param));
unmappedParameters.add(PyCallableParameterImpl.psi(param));
}
}
else {
unmappedParameters.add(new PyCallableParameterImpl(param));
unmappedParameters.add(PyCallableParameterImpl.psi(param));
}
}
if (argumentComponents.length > parameterComponents.length) {
@@ -170,7 +170,7 @@ public class PyFunctionImpl extends PyBaseElementImpl<PyFunctionStub> implements
.filter(PyCallableType.class::isInstance)
.map(PyCallableType.class::cast)
.map(callableType -> callableType.getParameters(context))
.orElseGet(() -> ContainerUtil.map(getParameterList().getParameters(), PyCallableParameterImpl::new));
.orElseGet(() -> ContainerUtil.map(getParameterList().getParameters(), PyCallableParameterImpl::psi));
}
@Override
@@ -74,7 +74,7 @@ public class PyLambdaExpressionImpl extends PyElementImpl implements PyLambdaExp
.filter(PyCallableType.class::isInstance)
.map(PyCallableType.class::cast)
.map(callableType -> callableType.getParameters(context))
.orElseGet(() -> ContainerUtil.map(getParameterList().getParameters(), PyCallableParameterImpl::new));
.orElseGet(() -> ContainerUtil.map(getParameterList().getParameters(), PyCallableParameterImpl::psi));
}
@Nullable
@@ -177,13 +177,13 @@ public class PyNamedParameterImpl extends PyBaseElementImpl<PyNamedParameterStub
@NotNull
@Override
public String getRepr(boolean includeDefaultValue, @Nullable TypeEvalContext context) {
return new PyCallableParameterImpl(this).getPresentableText(includeDefaultValue, context);
return PyCallableParameterImpl.psi(this).getPresentableText(includeDefaultValue, context);
}
@Override
@Nullable
public PyType getArgumentType(@NotNull TypeEvalContext context) {
return new PyCallableParameterImpl(this).getArgumentType(context);
return PyCallableParameterImpl.psi(this).getArgumentType(context);
}
@Override
@@ -253,7 +253,7 @@ public class PyNamedParameterImpl extends PyBaseElementImpl<PyNamedParameterStub
if (context.allowCallContext(this)) {
final List<PyType> types = new ArrayList<>();
final PyResolveContext resolveContext = PyResolveContext.noImplicits().withTypeEvalContext(context);
final PyCallableParameter parameter = new PyCallableParameterImpl(this);
final PyCallableParameter parameter = PyCallableParameterImpl.psi(this);
processLocalCalls(
func, call -> {
@@ -36,29 +36,39 @@ public class PyCallableParameterImpl implements PyCallableParameter {
@Nullable private final PyExpression myDefaultValue;
@Nullable private final PyParameter myElement;
public PyCallableParameterImpl(@Nullable String name, @Nullable PyType type) {
this(name, type, null);
}
public PyCallableParameterImpl(@Nullable String name, @Nullable PyType type, @Nullable PyExpression defaultValue) {
private PyCallableParameterImpl(@Nullable String name,
@Nullable Ref<PyType> type,
@Nullable PyExpression defaultValue,
@Nullable PyParameter element) {
myName = name;
myType = Ref.create(type);
myType = type;
myDefaultValue = defaultValue;
myElement = null;
}
public PyCallableParameterImpl(@NotNull PyParameter element) {
myName = null;
myType = null;
myDefaultValue = null;
myElement = element;
}
public PyCallableParameterImpl(@NotNull PyParameter element, @Nullable PyType type) {
myName = null;
myType = Ref.create(type);
myDefaultValue = null;
myElement = element;
@NotNull
public static PyCallableParameter nonPsi(@Nullable PyType type) {
return nonPsi(null, type);
}
@NotNull
public static PyCallableParameter nonPsi(@Nullable String name, @Nullable PyType type) {
return nonPsi(name, type, null);
}
@NotNull
public static PyCallableParameter nonPsi(@Nullable String name, @Nullable PyType type, @Nullable PyExpression defaultValue) {
return new PyCallableParameterImpl(name, Ref.create(type), defaultValue, null);
}
@NotNull
public static PyCallableParameter psi(@NotNull PyParameter parameter) {
return new PyCallableParameterImpl(null, null, null, parameter);
}
@NotNull
public static PyCallableParameter psi(@NotNull PyParameter parameter, @Nullable PyType type) {
return new PyCallableParameterImpl(null, Ref.create(type), null, parameter);
}
@Nullable
@@ -44,7 +44,7 @@ public class PyFunctionTypeImpl implements PyFunctionType {
@NotNull private final List<PyCallableParameter> myParameters;
public PyFunctionTypeImpl(@NotNull PyCallable callable) {
this(callable, ContainerUtil.map(callable.getParameterList().getParameters(), PyCallableParameterImpl::new));
this(callable, ContainerUtil.map(callable.getParameterList().getParameters(), PyCallableParameterImpl::psi));
}
public PyFunctionTypeImpl(@NotNull PyCallable callable, @NotNull List<PyCallableParameter> parameters) {
@@ -517,8 +517,8 @@ public class PyTypeChecker {
final PyType substType = substitute(parameter.getType(context), substitutions, context);
final PyParameter psi = parameter.getParameter();
final PyCallableParameter subst = psi != null ?
new PyCallableParameterImpl(psi, substType) :
new PyCallableParameterImpl(parameter.getName(), substType, parameter.getDefaultValue());
PyCallableParameterImpl.psi(psi, substType) :
PyCallableParameterImpl.nonPsi(parameter.getName(), substType, parameter.getDefaultValue());
substParams.add(subst);
}
}
@@ -266,10 +266,10 @@ public class PyTypeParser {
final ParseResult first = firstPair.getFirst();
final List<ParseResult> second = firstPair.getSecond();
result = first;
parameters.add(new PyCallableParameterImpl(null, first.getType()));
parameters.add(PyCallableParameterImpl.nonPsi(first.getType()));
for (ParseResult r : second) {
result = result.merge(r);
parameters.add(new PyCallableParameterImpl(null, r.getType()));
parameters.add(PyCallableParameterImpl.nonPsi(r.getType()));
}
result = result.merge(returnResult);
}