From ba973874a1473a3d3d9642cb9a6069bfbd5c351c Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 21 Jan 2010 16:24:42 +0300 Subject: [PATCH] continue work on annotation of keyword-only args --- .../com/jetbrains/python/PyBundle.properties | 1 + .../validation/ParameterListAnnotator.java | 20 ++++++++++---- .../python/validation/PyAnnotator.java | 26 ++++--------------- .../highlighting/keywordOnlyArguments.py | 10 +++++++ 4 files changed, 31 insertions(+), 26 deletions(-) diff --git a/python/src/com/jetbrains/python/PyBundle.properties b/python/src/com/jetbrains/python/PyBundle.properties index f1c41ab4465e..6b21c61ca43b 100644 --- a/python/src/com/jetbrains/python/PyBundle.properties +++ b/python/src/com/jetbrains/python/PyBundle.properties @@ -157,6 +157,7 @@ ANN.starred.param.after.kwparam=* parameter after ** parameter ANN.regular.param.after.vararg=regular parameter after * parameter ANN.regular.param.after.keyword=regular parameter after ** parameter ANN.non.default.param.after.default=non-default parameter follows default parameter +ANN.named.arguments.after.star=named arguments must follow bare * ANN.star.import.at.top.only='import *' only allowed at module level diff --git a/python/src/com/jetbrains/python/validation/ParameterListAnnotator.java b/python/src/com/jetbrains/python/validation/ParameterListAnnotator.java index b5ed3e66eea3..b5ee19d4fb38 100644 --- a/python/src/com/jetbrains/python/validation/ParameterListAnnotator.java +++ b/python/src/com/jetbrains/python/validation/ParameterListAnnotator.java @@ -22,34 +22,41 @@ public class ParameterListAnnotator extends PyAnnotator { boolean hadKeywordContainer = false; boolean hadDefaultValue = false; boolean hadSingleStar = false; + boolean hadParamsAfterSingleStar = false; @Override public void visitNamedParameter(PyNamedParameter parameter, boolean first, boolean last) { if (parameterNames.contains(parameter.getName())) { - getHolder().createErrorAnnotation(parameter, PyBundle.message("ANN.duplicate.param.name")); + markError(parameter, PyBundle.message("ANN.duplicate.param.name")); } parameterNames.add(parameter.getName()); if (parameter.isPositionalContainer()) { if (hadKeywordContainer) { - getHolder().createErrorAnnotation(parameter, PyBundle.message("ANN.starred.param.after.kwparam")); + markError(parameter, PyBundle.message("ANN.starred.param.after.kwparam")); } hadPositionalContainer = true; } else if (parameter.isKeywordContainer()) { hadKeywordContainer = true; + if (hadSingleStar && !hadParamsAfterSingleStar) { + markError(parameter, PyBundle.message("ANN.named.arguments.after.star")); + } } else { + if (hadSingleStar) { + hadParamsAfterSingleStar = true; + } if (hadPositionalContainer && !languageLevel.isPy3K()) { - getHolder().createErrorAnnotation(parameter, PyBundle.message("ANN.regular.param.after.vararg")); + markError(parameter, PyBundle.message("ANN.regular.param.after.vararg")); } else if (hadKeywordContainer) { - getHolder().createErrorAnnotation(parameter, PyBundle.message("ANN.regular.param.after.keyword")); + markError(parameter, PyBundle.message("ANN.regular.param.after.keyword")); } if (parameter.getDefaultValue() != null) { hadDefaultValue = true; } else { if (hadDefaultValue && !hadSingleStar && (!languageLevel.isPy3K() || !hadPositionalContainer)) { - getHolder().createErrorAnnotation(parameter, PyBundle.message("ANN.non.default.param.after.default")); + markError(parameter, PyBundle.message("ANN.non.default.param.after.default")); } } } @@ -58,6 +65,9 @@ public class ParameterListAnnotator extends PyAnnotator { @Override public void visitSingleStarParameter(PySingleStarParameter param, boolean first, boolean last) { hadSingleStar = true; + if (last) { + markError(param, PyBundle.message("ANN.named.arguments.after.star")); + } } } ); diff --git a/python/src/com/jetbrains/python/validation/PyAnnotator.java b/python/src/com/jetbrains/python/validation/PyAnnotator.java index 69017f8a6c0c..f6a2a777c0fc 100644 --- a/python/src/com/jetbrains/python/validation/PyAnnotator.java +++ b/python/src/com/jetbrains/python/validation/PyAnnotator.java @@ -1,19 +1,3 @@ -/* - * Copyright 2005 Pythonid Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS"; BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - package com.jetbrains.python.validation; import com.jetbrains.python.psi.PyElementVisitor; @@ -21,11 +5,7 @@ import com.intellij.lang.annotation.AnnotationHolder; import com.intellij.psi.PsiElement; /** - * Created by IntelliJ IDEA. - * User: yole - * Date: 12.06.2005 - * Time: 13:43:02 - * To change this template use File | Settings | File Templates. + * @author yole */ public abstract class PyAnnotator extends PyElementVisitor { private AnnotationHolder _holder; @@ -47,4 +27,8 @@ public abstract class PyAnnotator extends PyElementVisitor { setHolder(null); } } + + protected void markError(PsiElement element, String message) { + getHolder().createErrorAnnotation(element, message); + } } diff --git a/python/testData/highlighting/keywordOnlyArguments.py b/python/testData/highlighting/keywordOnlyArguments.py index 6d05652c5442..b9feafa3c368 100644 --- a/python/testData/highlighting/keywordOnlyArguments.py +++ b/python/testData/highlighting/keywordOnlyArguments.py @@ -1,2 +1,12 @@ def keywordonly_sum(*, k1=0, k2): return k1 + k2 + +def keywordonly_sum_bad1(p, *): + pass + +def keywordonly_sum_bad2(p1, *, **k1): + pass + +def keywordonly_and_kwarg_sum(*, k1, k2, **kwarg): + return k1 + k2 + sum(kwarg.values()) + \ No newline at end of file