From bd17d0cffb0afa93dc59c199f85ca547d652dc53 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 13 Dec 2010 16:40:28 +0300 Subject: [PATCH] IDEA-57183 Gant: Ant tasks are considered to be not applicable to String argument IDEA-61490 Gant: "Cannot determine type of" message for all predefined tasks --- .../plugins/groovy/gant/AntBuilderMethod.java | 16 +++++++++-- .../plugins/groovy/gant/AntTasksProvider.java | 8 ++---- .../gant/GantReferenceCompletionTest.groovy | 28 +++++++++++++++++++ 3 files changed, 44 insertions(+), 8 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/gant/AntBuilderMethod.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/gant/AntBuilderMethod.java index f5637b62ef51..502abd903a17 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/gant/AntBuilderMethod.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/gant/AntBuilderMethod.java @@ -2,6 +2,7 @@ package org.jetbrains.plugins.groovy.gant; import com.intellij.lang.ant.dom.AntDomExtender; import com.intellij.lang.ant.psi.impl.AntIntrospector; +import com.intellij.openapi.util.Computable; import com.intellij.psi.*; import com.intellij.psi.impl.light.LightMethodBuilder; import com.intellij.psi.scope.PsiScopeProcessor; @@ -22,14 +23,21 @@ class AntBuilderMethod extends LightMethodBuilder implements GrBuilderMethod { private final PsiFile myPlace; @Nullable private final Class myAntClass; - public AntBuilderMethod(PsiFile place, String name, PsiType closureType, @Nullable Class antClass) { + public AntBuilderMethod(PsiFile place, String name, PsiType closureType, @Nullable Class antClass, final PsiType stringType) { super(place.getManager(), GroovyFileType.GROOVY_LANGUAGE, name); myPlace = place; myAntClass = antClass; setModifiers(PsiModifier.PUBLIC); addParameter("args", new GrMapType(place.getResolveScope())); setBaseIcon(GantIcons.ANT_TASK); + addParameter(new GrLightParameter("singleArg", stringType, this).setOptional(true)); addParameter(new GrLightParameter("body", closureType, this).setOptional(true)); + setReturnType(new Computable() { + @Override + public PsiType compute() { + return PsiType.getJavaLangObject(getManager(), getResolveScope()); + } + }); } @NotNull @@ -48,11 +56,13 @@ class AntBuilderMethod extends LightMethodBuilder implements GrBuilderMethod { final AntIntrospector introspector = AntDomExtender.getIntrospector(myAntClass); if (introspector != null) { String expectedName = ResolveUtil.getNameHint(processor); - final PsiType closureType = getParameterList().getParameters()[1].getType(); + final PsiType stringType = getParameterList().getParameters()[1].getType(); + final PsiType closureType = getParameterList().getParameters()[2].getType(); for (String name : Collections.list(introspector.getNestedElements())) { if (expectedName == null || expectedName.equals(name)) { - final AntBuilderMethod method = new AntBuilderMethod(myPlace, name, closureType, introspector.getElementType(name)); + final AntBuilderMethod method = new AntBuilderMethod(myPlace, name, closureType, introspector.getElementType(name), + stringType); if (!processor.execute(method, ResolveState.initial())) return false; } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/gant/AntTasksProvider.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/gant/AntTasksProvider.java index 72b6c688f636..52287d65beeb 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/gant/AntTasksProvider.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/gant/AntTasksProvider.java @@ -27,10 +27,7 @@ import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.util.Key; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.JavaPsiFacade; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiFile; -import com.intellij.psi.PsiType; +import com.intellij.psi.*; import com.intellij.psi.impl.light.LightMethodBuilder; import com.intellij.psi.util.CachedValue; import com.intellij.psi.util.CachedValueProvider; @@ -85,9 +82,10 @@ public class AntTasksProvider { final Project project = file.getProject(); final PsiType closureType = JavaPsiFacade.getElementFactory(project).createTypeFromText(GrClosableBlock.GROOVY_LANG_CLOSURE, file); + final PsiClassType stringType = PsiType.getJavaLangString(file.getManager(), file.getResolveScope()); for (String name : antObjects.keySet()) { - methods.add(new AntBuilderMethod(file, name, closureType, antObjects.get(name))); + methods.add(new AntBuilderMethod(file, name, closureType, antObjects.get(name), stringType)); } final Result> result = Result.create(methods, PsiModificationTracker.JAVA_STRUCTURE_MODIFICATION_COUNT, ProjectRootManager.getInstance(project)); diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/gant/GantReferenceCompletionTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/gant/GantReferenceCompletionTest.groovy index 5f684771af7f..ebb97fead944 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/gant/GantReferenceCompletionTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/gant/GantReferenceCompletionTest.groovy @@ -28,6 +28,8 @@ import com.intellij.openapi.roots.libraries.Library import com.intellij.openapi.vfs.JarFileSystem import com.intellij.testFramework.LightProjectDescriptor import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase +import org.jetbrains.plugins.groovy.codeInspection.assignment.GroovyAssignabilityCheckInspection +import org.jetbrains.plugins.groovy.codeInspection.untypedUnresolvedAccess.GroovyUntypedAccessInspection import org.jetbrains.plugins.groovy.util.TestUtils /** @@ -144,6 +146,32 @@ target(aaa: "") { }""", "include", "includesfile", "includeTargets", "includeTool" } + public void testUntypedTargets() throws Exception { + myFixture.enableInspections(new GroovyUntypedAccessInspection()) + + myFixture.configureByText "a.gant", """ +target (default : '') { + echo(message: 'Echo task.') + copy(file: 'from.txt', tofile: 'to.txt') + delete(file: 'to.txt') +}""" + myFixture.checkHighlighting(true, false, false) + + } + + public void testStringTargets() throws Exception { + myFixture.enableInspections(new GroovyAssignabilityCheckInspection()) + + myFixture.configureByText "a.gant", """ +target (default : '') { + echo(new FileInputStream()) + echo("hello2") + echo(message: 'Echo task.') + ant.fail('Failure reason') +}""" + myFixture.checkHighlighting(true, false, false) + } + static final def GANT_JARS = ["gant.jar", "ant.jar", "ant-junit.jar", "ant-launcher.jar", "commons.jar"] }