diff --git a/plugins/sh/gen/com/intellij/sh/psi/impl/ShIncludeCommandImpl.java b/plugins/sh/gen/com/intellij/sh/psi/impl/ShIncludeCommandImpl.java index 36eea30ee57f..8f665822a46a 100644 --- a/plugins/sh/gen/com/intellij/sh/psi/impl/ShIncludeCommandImpl.java +++ b/plugins/sh/gen/com/intellij/sh/psi/impl/ShIncludeCommandImpl.java @@ -10,7 +10,7 @@ import com.intellij.psi.util.PsiTreeUtil; import static com.intellij.sh.ShTypes.*; import com.intellij.sh.psi.*; -public class ShIncludeCommandImpl extends ShCommandImpl implements ShIncludeCommand { +public class ShIncludeCommandImpl extends ShIncludeCommandMixin implements ShIncludeCommand { public ShIncludeCommandImpl(ASTNode node) { super(node); diff --git a/plugins/sh/grammar/sh.bnf b/plugins/sh/grammar/sh.bnf index 725b6b13d85e..5fe4228c1c3e 100644 --- a/plugins/sh/grammar/sh.bnf +++ b/plugins/sh/grammar/sh.bnf @@ -159,7 +159,10 @@ private redirection_inner ::= ('<&' | '>&') (number | '-') private redirection_target ::= process_substitution | <> {name="redirection target"} process_substitution ::= ('<(' | '>(') list ')' {pin=1} -include_command ::= include_directive (simple_command_element | <>)+ {pin=0} +include_command ::= include_directive (simple_command_element | <>)+ { + pin=0 + mixin="com.intellij.sh.psi.impl.ShIncludeCommandMixin" +} include_directive ::= &('source' | '.') word {extends=generic_command_directive} shell_command ::= if_command diff --git a/plugins/sh/src/com/intellij/sh/psi/impl/ShIncludeCommandMixin.java b/plugins/sh/src/com/intellij/sh/psi/impl/ShIncludeCommandMixin.java new file mode 100644 index 000000000000..95f08b0d2ad2 --- /dev/null +++ b/plugins/sh/src/com/intellij/sh/psi/impl/ShIncludeCommandMixin.java @@ -0,0 +1,53 @@ +// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package com.intellij.sh.psi.impl; + +import com.intellij.lang.ASTNode; +import com.intellij.openapi.vfs.VfsUtilCore; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.*; +import com.intellij.psi.scope.PsiScopeProcessor; +import com.intellij.sh.psi.ShIncludeCommand; +import com.intellij.sh.psi.ShSimpleCommandElement; +import com.intellij.sh.psi.ShString; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +abstract class ShIncludeCommandMixin extends ShCommandImpl implements ShIncludeCommand { + ShIncludeCommandMixin(ASTNode node) { + super(node); + } + + @Override + public boolean processDeclarations(@NotNull PsiScopeProcessor processor, + @NotNull ResolveState state, + PsiElement lastParent, + @NotNull PsiElement place) { + List commandsList = getSimpleCommandElementList(); + if (commandsList.size() <= 0) return true; + ShSimpleCommandElement simpleCommandElement = commandsList.get(0); + String relativeFilePath = simpleCommandElement.getText(); + if (simpleCommandElement instanceof ShString) { + ShString shString = (ShString)simpleCommandElement; + if (relativeFilePath.length() >= 2 && + (shString.getOpenQuote() != null && shString.getCloseQuote() != null) || + (shString.getRawString() != null && relativeFilePath.startsWith("'") && relativeFilePath.endsWith("'"))) { + relativeFilePath = relativeFilePath.substring(1, relativeFilePath.length() - 1); + } + } else { + if (relativeFilePath.contains("\\ ")) { + relativeFilePath = relativeFilePath.replace("\\ ", " "); + } + } + + PsiDirectory containingDirectory = getContainingFile().getContainingDirectory(); + if (containingDirectory == null) return true; + VirtualFile relativeFile = VfsUtilCore.findRelativeFile(relativeFilePath, containingDirectory.getVirtualFile()); + if (relativeFile == null) return true; + VirtualFile sourceFile = place.getContainingFile().getVirtualFile(); + if (relativeFile.equals(sourceFile)) return true; + PsiFile includedPsiFile = PsiManager.getInstance(getProject()).findFile(relativeFile); + if (includedPsiFile == null) return true; + return includedPsiFile.processDeclarations(processor, state, this, place); + } +} diff --git a/plugins/sh/testData/resolve/caseFive.sh b/plugins/sh/testData/resolve/file_scope/caseFive.sh similarity index 100% rename from plugins/sh/testData/resolve/caseFive.sh rename to plugins/sh/testData/resolve/file_scope/caseFive.sh diff --git a/plugins/sh/testData/resolve/caseFour.sh b/plugins/sh/testData/resolve/file_scope/caseFour.sh similarity index 100% rename from plugins/sh/testData/resolve/caseFour.sh rename to plugins/sh/testData/resolve/file_scope/caseFour.sh diff --git a/plugins/sh/testData/resolve/caseOne.sh b/plugins/sh/testData/resolve/file_scope/caseOne.sh similarity index 100% rename from plugins/sh/testData/resolve/caseOne.sh rename to plugins/sh/testData/resolve/file_scope/caseOne.sh diff --git a/plugins/sh/testData/resolve/caseSeven.sh b/plugins/sh/testData/resolve/file_scope/caseSeven.sh similarity index 100% rename from plugins/sh/testData/resolve/caseSeven.sh rename to plugins/sh/testData/resolve/file_scope/caseSeven.sh diff --git a/plugins/sh/testData/resolve/caseSix.sh b/plugins/sh/testData/resolve/file_scope/caseSix.sh similarity index 100% rename from plugins/sh/testData/resolve/caseSix.sh rename to plugins/sh/testData/resolve/file_scope/caseSix.sh diff --git a/plugins/sh/testData/resolve/caseThree.sh b/plugins/sh/testData/resolve/file_scope/caseThree.sh similarity index 100% rename from plugins/sh/testData/resolve/caseThree.sh rename to plugins/sh/testData/resolve/file_scope/caseThree.sh diff --git a/plugins/sh/testData/resolve/caseTwo.sh b/plugins/sh/testData/resolve/file_scope/caseTwo.sh similarity index 100% rename from plugins/sh/testData/resolve/caseTwo.sh rename to plugins/sh/testData/resolve/file_scope/caseTwo.sh diff --git a/plugins/sh/testData/resolve/fromFunction.sh b/plugins/sh/testData/resolve/file_scope/fromFunction.sh similarity index 100% rename from plugins/sh/testData/resolve/fromFunction.sh rename to plugins/sh/testData/resolve/file_scope/fromFunction.sh diff --git a/plugins/sh/testData/resolve/functionCaseOne.sh b/plugins/sh/testData/resolve/file_scope/functionCaseOne.sh similarity index 100% rename from plugins/sh/testData/resolve/functionCaseOne.sh rename to plugins/sh/testData/resolve/file_scope/functionCaseOne.sh diff --git a/plugins/sh/testData/resolve/functionCaseThree.sh b/plugins/sh/testData/resolve/file_scope/functionCaseThree.sh similarity index 100% rename from plugins/sh/testData/resolve/functionCaseThree.sh rename to plugins/sh/testData/resolve/file_scope/functionCaseThree.sh diff --git a/plugins/sh/testData/resolve/functionCaseTwo.sh b/plugins/sh/testData/resolve/file_scope/functionCaseTwo.sh similarity index 100% rename from plugins/sh/testData/resolve/functionCaseTwo.sh rename to plugins/sh/testData/resolve/file_scope/functionCaseTwo.sh diff --git a/plugins/sh/testData/resolve/functionCommandSubstitution.sh b/plugins/sh/testData/resolve/file_scope/functionCommandSubstitution.sh similarity index 100% rename from plugins/sh/testData/resolve/functionCommandSubstitution.sh rename to plugins/sh/testData/resolve/file_scope/functionCommandSubstitution.sh diff --git a/plugins/sh/testData/resolve/functionUnavailable.sh b/plugins/sh/testData/resolve/file_scope/functionUnavailable.sh similarity index 100% rename from plugins/sh/testData/resolve/functionUnavailable.sh rename to plugins/sh/testData/resolve/file_scope/functionUnavailable.sh diff --git a/plugins/sh/testData/resolve/innerFunction.sh b/plugins/sh/testData/resolve/file_scope/innerFunction.sh similarity index 100% rename from plugins/sh/testData/resolve/innerFunction.sh rename to plugins/sh/testData/resolve/file_scope/innerFunction.sh diff --git a/plugins/sh/testData/resolve/outerFunctionCaseOne.sh b/plugins/sh/testData/resolve/file_scope/outerFunctionCaseOne.sh similarity index 100% rename from plugins/sh/testData/resolve/outerFunctionCaseOne.sh rename to plugins/sh/testData/resolve/file_scope/outerFunctionCaseOne.sh diff --git a/plugins/sh/testData/resolve/outerFunctionCaseTwo.sh b/plugins/sh/testData/resolve/file_scope/outerFunctionCaseTwo.sh similarity index 100% rename from plugins/sh/testData/resolve/outerFunctionCaseTwo.sh rename to plugins/sh/testData/resolve/file_scope/outerFunctionCaseTwo.sh diff --git a/plugins/sh/testData/resolve/overridingFunctionCaseFive.sh b/plugins/sh/testData/resolve/file_scope/overridingFunctionCaseFive.sh similarity index 100% rename from plugins/sh/testData/resolve/overridingFunctionCaseFive.sh rename to plugins/sh/testData/resolve/file_scope/overridingFunctionCaseFive.sh diff --git a/plugins/sh/testData/resolve/overridingFunctionCaseFour.sh b/plugins/sh/testData/resolve/file_scope/overridingFunctionCaseFour.sh similarity index 100% rename from plugins/sh/testData/resolve/overridingFunctionCaseFour.sh rename to plugins/sh/testData/resolve/file_scope/overridingFunctionCaseFour.sh diff --git a/plugins/sh/testData/resolve/overridingFunctionCaseOne.sh b/plugins/sh/testData/resolve/file_scope/overridingFunctionCaseOne.sh similarity index 100% rename from plugins/sh/testData/resolve/overridingFunctionCaseOne.sh rename to plugins/sh/testData/resolve/file_scope/overridingFunctionCaseOne.sh diff --git a/plugins/sh/testData/resolve/overridingFunctionCaseThree.sh b/plugins/sh/testData/resolve/file_scope/overridingFunctionCaseThree.sh similarity index 100% rename from plugins/sh/testData/resolve/overridingFunctionCaseThree.sh rename to plugins/sh/testData/resolve/file_scope/overridingFunctionCaseThree.sh diff --git a/plugins/sh/testData/resolve/overridingFunctionCaseTwo.sh b/plugins/sh/testData/resolve/file_scope/overridingFunctionCaseTwo.sh similarity index 100% rename from plugins/sh/testData/resolve/overridingFunctionCaseTwo.sh rename to plugins/sh/testData/resolve/file_scope/overridingFunctionCaseTwo.sh diff --git a/plugins/sh/testData/resolve/recursiveFunction.sh b/plugins/sh/testData/resolve/file_scope/recursiveFunction.sh similarity index 100% rename from plugins/sh/testData/resolve/recursiveFunction.sh rename to plugins/sh/testData/resolve/file_scope/recursiveFunction.sh diff --git a/plugins/sh/testData/resolve/simpleFunction.sh b/plugins/sh/testData/resolve/file_scope/simpleFunction.sh similarity index 100% rename from plugins/sh/testData/resolve/simpleFunction.sh rename to plugins/sh/testData/resolve/file_scope/simpleFunction.sh diff --git a/plugins/sh/testData/resolve/imported_file_scope/caseEight/source.sh b/plugins/sh/testData/resolve/imported_file_scope/caseEight/source.sh new file mode 100644 index 000000000000..7daf3db907a0 --- /dev/null +++ b/plugins/sh/testData/resolve/imported_file_scope/caseEight/source.sh @@ -0,0 +1,5 @@ +#!/bin/zsh + +foo + +source "./target.sh" diff --git a/plugins/sh/testData/resolve/imported_file_scope/caseEight/target.sh b/plugins/sh/testData/resolve/imported_file_scope/caseEight/target.sh new file mode 100644 index 000000000000..b140134eb036 --- /dev/null +++ b/plugins/sh/testData/resolve/imported_file_scope/caseEight/target.sh @@ -0,0 +1,5 @@ +#!/bin/zsh + +function foo() { + echo "Simple text" +} diff --git a/plugins/sh/testData/resolve/imported_file_scope/caseFive/another folder/target.sh b/plugins/sh/testData/resolve/imported_file_scope/caseFive/another folder/target.sh new file mode 100644 index 000000000000..b140134eb036 --- /dev/null +++ b/plugins/sh/testData/resolve/imported_file_scope/caseFive/another folder/target.sh @@ -0,0 +1,5 @@ +#!/bin/zsh + +function foo() { + echo "Simple text" +} diff --git a/plugins/sh/testData/resolve/imported_file_scope/caseFive/source.sh b/plugins/sh/testData/resolve/imported_file_scope/caseFive/source.sh new file mode 100644 index 000000000000..55ff6ef827e7 --- /dev/null +++ b/plugins/sh/testData/resolve/imported_file_scope/caseFive/source.sh @@ -0,0 +1,5 @@ +#!/bin/zsh + +source "./another folder/target.sh" + +foo \ No newline at end of file diff --git a/plugins/sh/testData/resolve/imported_file_scope/caseFour/another folder/target.sh b/plugins/sh/testData/resolve/imported_file_scope/caseFour/another folder/target.sh new file mode 100644 index 000000000000..b140134eb036 --- /dev/null +++ b/plugins/sh/testData/resolve/imported_file_scope/caseFour/another folder/target.sh @@ -0,0 +1,5 @@ +#!/bin/zsh + +function foo() { + echo "Simple text" +} diff --git a/plugins/sh/testData/resolve/imported_file_scope/caseFour/source.sh b/plugins/sh/testData/resolve/imported_file_scope/caseFour/source.sh new file mode 100644 index 000000000000..23bfde84f5c7 --- /dev/null +++ b/plugins/sh/testData/resolve/imported_file_scope/caseFour/source.sh @@ -0,0 +1,5 @@ +#!/bin/zsh + +source ./another\ folder/target.sh + +foo \ No newline at end of file diff --git a/plugins/sh/testData/resolve/imported_file_scope/caseNine/folder/target.sh b/plugins/sh/testData/resolve/imported_file_scope/caseNine/folder/target.sh new file mode 100644 index 000000000000..b140134eb036 --- /dev/null +++ b/plugins/sh/testData/resolve/imported_file_scope/caseNine/folder/target.sh @@ -0,0 +1,5 @@ +#!/bin/zsh + +function foo() { + echo "Simple text" +} diff --git a/plugins/sh/testData/resolve/imported_file_scope/caseNine/source.sh b/plugins/sh/testData/resolve/imported_file_scope/caseNine/source.sh new file mode 100644 index 000000000000..53436d2d63e5 --- /dev/null +++ b/plugins/sh/testData/resolve/imported_file_scope/caseNine/source.sh @@ -0,0 +1,5 @@ +#!/bin/zsh + +source folder/target.sh + +foo \ No newline at end of file diff --git a/plugins/sh/testData/resolve/imported_file_scope/caseOne/source.sh b/plugins/sh/testData/resolve/imported_file_scope/caseOne/source.sh new file mode 100644 index 000000000000..103228b57c2f --- /dev/null +++ b/plugins/sh/testData/resolve/imported_file_scope/caseOne/source.sh @@ -0,0 +1,5 @@ +#!/bin/zsh + +source ./target.sh + +foo \ No newline at end of file diff --git a/plugins/sh/testData/resolve/imported_file_scope/caseOne/target.sh b/plugins/sh/testData/resolve/imported_file_scope/caseOne/target.sh new file mode 100644 index 000000000000..b140134eb036 --- /dev/null +++ b/plugins/sh/testData/resolve/imported_file_scope/caseOne/target.sh @@ -0,0 +1,5 @@ +#!/bin/zsh + +function foo() { + echo "Simple text" +} diff --git a/plugins/sh/testData/resolve/imported_file_scope/caseSeven/source.sh b/plugins/sh/testData/resolve/imported_file_scope/caseSeven/source.sh new file mode 100644 index 000000000000..0d78041e47f0 --- /dev/null +++ b/plugins/sh/testData/resolve/imported_file_scope/caseSeven/source.sh @@ -0,0 +1,9 @@ +#!/bin/zsh + +source "./target.sh" + +function foo() { + echo "One more text" +} + +foo \ No newline at end of file diff --git a/plugins/sh/testData/resolve/imported_file_scope/caseSeven/target.sh b/plugins/sh/testData/resolve/imported_file_scope/caseSeven/target.sh new file mode 100644 index 000000000000..b140134eb036 --- /dev/null +++ b/plugins/sh/testData/resolve/imported_file_scope/caseSeven/target.sh @@ -0,0 +1,5 @@ +#!/bin/zsh + +function foo() { + echo "Simple text" +} diff --git a/plugins/sh/testData/resolve/imported_file_scope/caseSix/parent folder/source.sh b/plugins/sh/testData/resolve/imported_file_scope/caseSix/parent folder/source.sh new file mode 100644 index 000000000000..59e6391189e3 --- /dev/null +++ b/plugins/sh/testData/resolve/imported_file_scope/caseSix/parent folder/source.sh @@ -0,0 +1,5 @@ +#!/bin/zsh + +source ../target.sh + +foo \ No newline at end of file diff --git a/plugins/sh/testData/resolve/imported_file_scope/caseSix/target.sh b/plugins/sh/testData/resolve/imported_file_scope/caseSix/target.sh new file mode 100644 index 000000000000..b140134eb036 --- /dev/null +++ b/plugins/sh/testData/resolve/imported_file_scope/caseSix/target.sh @@ -0,0 +1,5 @@ +#!/bin/zsh + +function foo() { + echo "Simple text" +} diff --git a/plugins/sh/testData/resolve/imported_file_scope/caseThree/source.sh b/plugins/sh/testData/resolve/imported_file_scope/caseThree/source.sh new file mode 100644 index 000000000000..ed9c7366e93c --- /dev/null +++ b/plugins/sh/testData/resolve/imported_file_scope/caseThree/source.sh @@ -0,0 +1,5 @@ +#!/bin/zsh + +source './target.sh' + +foo \ No newline at end of file diff --git a/plugins/sh/testData/resolve/imported_file_scope/caseThree/target.sh b/plugins/sh/testData/resolve/imported_file_scope/caseThree/target.sh new file mode 100644 index 000000000000..b140134eb036 --- /dev/null +++ b/plugins/sh/testData/resolve/imported_file_scope/caseThree/target.sh @@ -0,0 +1,5 @@ +#!/bin/zsh + +function foo() { + echo "Simple text" +} diff --git a/plugins/sh/testData/resolve/imported_file_scope/caseTwo/source.sh b/plugins/sh/testData/resolve/imported_file_scope/caseTwo/source.sh new file mode 100644 index 000000000000..7eee93e614e6 --- /dev/null +++ b/plugins/sh/testData/resolve/imported_file_scope/caseTwo/source.sh @@ -0,0 +1,5 @@ +#!/bin/zsh + +source "./target.sh" + +foo \ No newline at end of file diff --git a/plugins/sh/testData/resolve/imported_file_scope/caseTwo/target.sh b/plugins/sh/testData/resolve/imported_file_scope/caseTwo/target.sh new file mode 100644 index 000000000000..b140134eb036 --- /dev/null +++ b/plugins/sh/testData/resolve/imported_file_scope/caseTwo/target.sh @@ -0,0 +1,5 @@ +#!/bin/zsh + +function foo() { + echo "Simple text" +} diff --git a/plugins/sh/testData/resolve/imported_file_scope/cyclicImport/source.sh b/plugins/sh/testData/resolve/imported_file_scope/cyclicImport/source.sh new file mode 100644 index 000000000000..e34ea6204bbb --- /dev/null +++ b/plugins/sh/testData/resolve/imported_file_scope/cyclicImport/source.sh @@ -0,0 +1,6 @@ +#!/bin/zsh + +source "./target.sh" + +foo + diff --git a/plugins/sh/testData/resolve/imported_file_scope/cyclicImport/target.sh b/plugins/sh/testData/resolve/imported_file_scope/cyclicImport/target.sh new file mode 100644 index 000000000000..b9bc1c081b32 --- /dev/null +++ b/plugins/sh/testData/resolve/imported_file_scope/cyclicImport/target.sh @@ -0,0 +1,7 @@ +#!/bin/zsh + +source "./source.sh" + +function bar() { + echo "Another Text" +} diff --git a/plugins/sh/testData/resolve/imported_file_scope/cyclicImportCaseTwo/source.sh b/plugins/sh/testData/resolve/imported_file_scope/cyclicImportCaseTwo/source.sh new file mode 100644 index 000000000000..a28bd605fbfb --- /dev/null +++ b/plugins/sh/testData/resolve/imported_file_scope/cyclicImportCaseTwo/source.sh @@ -0,0 +1,6 @@ +#!/bin/zsh + +source "./tmp.sh" + +foo + diff --git a/plugins/sh/testData/resolve/imported_file_scope/cyclicImportCaseTwo/target.sh b/plugins/sh/testData/resolve/imported_file_scope/cyclicImportCaseTwo/target.sh new file mode 100644 index 000000000000..048fe52bbf12 --- /dev/null +++ b/plugins/sh/testData/resolve/imported_file_scope/cyclicImportCaseTwo/target.sh @@ -0,0 +1,3 @@ +#!/bin/zsh + +source ./source.sh diff --git a/plugins/sh/testData/resolve/imported_file_scope/cyclicImportCaseTwo/tmp.sh b/plugins/sh/testData/resolve/imported_file_scope/cyclicImportCaseTwo/tmp.sh new file mode 100644 index 000000000000..1b29789d8465 --- /dev/null +++ b/plugins/sh/testData/resolve/imported_file_scope/cyclicImportCaseTwo/tmp.sh @@ -0,0 +1,3 @@ +#!/bin/zsh + +source ./target.sh \ No newline at end of file diff --git a/plugins/sh/testData/resolve/imported_file_scope/dotTransitiveImport/source.sh b/plugins/sh/testData/resolve/imported_file_scope/dotTransitiveImport/source.sh new file mode 100644 index 000000000000..6013ee689f1c --- /dev/null +++ b/plugins/sh/testData/resolve/imported_file_scope/dotTransitiveImport/source.sh @@ -0,0 +1,6 @@ +#!/bin/zsh + +. "./tmp.sh" + +foo + diff --git a/plugins/sh/testData/resolve/imported_file_scope/dotTransitiveImport/target.sh b/plugins/sh/testData/resolve/imported_file_scope/dotTransitiveImport/target.sh new file mode 100644 index 000000000000..c5f777f7e5d8 --- /dev/null +++ b/plugins/sh/testData/resolve/imported_file_scope/dotTransitiveImport/target.sh @@ -0,0 +1,5 @@ +#!/bin/zsh + +function foo() { + echo "Another Text" +} diff --git a/plugins/sh/testData/resolve/imported_file_scope/dotTransitiveImport/tmp.sh b/plugins/sh/testData/resolve/imported_file_scope/dotTransitiveImport/tmp.sh new file mode 100644 index 000000000000..32904708eeb4 --- /dev/null +++ b/plugins/sh/testData/resolve/imported_file_scope/dotTransitiveImport/tmp.sh @@ -0,0 +1,3 @@ +#!/bin/zsh + +. ./target.sh \ No newline at end of file diff --git a/plugins/sh/testData/resolve/imported_file_scope/sameFolder/source.sh b/plugins/sh/testData/resolve/imported_file_scope/sameFolder/source.sh new file mode 100644 index 000000000000..996418ed058c --- /dev/null +++ b/plugins/sh/testData/resolve/imported_file_scope/sameFolder/source.sh @@ -0,0 +1,5 @@ +#!/bin/zsh + +source target.sh + +foo \ No newline at end of file diff --git a/plugins/sh/testData/resolve/imported_file_scope/sameFolder/target.sh b/plugins/sh/testData/resolve/imported_file_scope/sameFolder/target.sh new file mode 100644 index 000000000000..b140134eb036 --- /dev/null +++ b/plugins/sh/testData/resolve/imported_file_scope/sameFolder/target.sh @@ -0,0 +1,5 @@ +#!/bin/zsh + +function foo() { + echo "Simple text" +} diff --git a/plugins/sh/testData/resolve/imported_file_scope/transitiveImport/source.sh b/plugins/sh/testData/resolve/imported_file_scope/transitiveImport/source.sh new file mode 100644 index 000000000000..a28bd605fbfb --- /dev/null +++ b/plugins/sh/testData/resolve/imported_file_scope/transitiveImport/source.sh @@ -0,0 +1,6 @@ +#!/bin/zsh + +source "./tmp.sh" + +foo + diff --git a/plugins/sh/testData/resolve/imported_file_scope/transitiveImport/target.sh b/plugins/sh/testData/resolve/imported_file_scope/transitiveImport/target.sh new file mode 100644 index 000000000000..c5f777f7e5d8 --- /dev/null +++ b/plugins/sh/testData/resolve/imported_file_scope/transitiveImport/target.sh @@ -0,0 +1,5 @@ +#!/bin/zsh + +function foo() { + echo "Another Text" +} diff --git a/plugins/sh/testData/resolve/imported_file_scope/transitiveImport/tmp.sh b/plugins/sh/testData/resolve/imported_file_scope/transitiveImport/tmp.sh new file mode 100644 index 000000000000..1b29789d8465 --- /dev/null +++ b/plugins/sh/testData/resolve/imported_file_scope/transitiveImport/tmp.sh @@ -0,0 +1,3 @@ +#!/bin/zsh + +source ./target.sh \ No newline at end of file diff --git a/plugins/sh/testData/resolve/imported_file_scope/withParams/source.sh b/plugins/sh/testData/resolve/imported_file_scope/withParams/source.sh new file mode 100644 index 000000000000..26de41e10046 --- /dev/null +++ b/plugins/sh/testData/resolve/imported_file_scope/withParams/source.sh @@ -0,0 +1,5 @@ +#!/bin/zsh + +source target.sh 1 "Some text" true + +foo \ No newline at end of file diff --git a/plugins/sh/testData/resolve/imported_file_scope/withParams/target.sh b/plugins/sh/testData/resolve/imported_file_scope/withParams/target.sh new file mode 100644 index 000000000000..b140134eb036 --- /dev/null +++ b/plugins/sh/testData/resolve/imported_file_scope/withParams/target.sh @@ -0,0 +1,5 @@ +#!/bin/zsh + +function foo() { + echo "Simple text" +} diff --git a/plugins/sh/tests/com/intellij/sh/ShTestSuite.java b/plugins/sh/tests/com/intellij/sh/ShTestSuite.java index bb80d507bf2b..80efd114c501 100644 --- a/plugins/sh/tests/com/intellij/sh/ShTestSuite.java +++ b/plugins/sh/tests/com/intellij/sh/ShTestSuite.java @@ -2,6 +2,7 @@ package com.intellij.sh; import com.intellij.sh.actions.ShBaseGenerateActionsTest; +import com.intellij.sh.codeInsight.ShFunctionResolverInImportedFileTest; import com.intellij.sh.codeInsight.ShFunctionResolverTest; import com.intellij.sh.completion.ShCompletionTest; import com.intellij.sh.completion.ShFileCompletionTest; @@ -81,6 +82,7 @@ public class ShTestSuite { suite.addTestSuite(ShTypingTest.class); suite.addTestSuite(ShLineIndentProviderTest.class); suite.addTestSuite(ShFunctionResolverTest.class); + suite.addTestSuite(ShFunctionResolverInImportedFileTest.class); return suite; } } diff --git a/plugins/sh/tests/com/intellij/sh/codeInsight/ShFunctionResolverInImportedFileTest.java b/plugins/sh/tests/com/intellij/sh/codeInsight/ShFunctionResolverInImportedFileTest.java new file mode 100644 index 000000000000..d6226160d9b2 --- /dev/null +++ b/plugins/sh/tests/com/intellij/sh/codeInsight/ShFunctionResolverInImportedFileTest.java @@ -0,0 +1,81 @@ +// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.intellij.sh.codeInsight; + +import com.intellij.openapi.application.PluginPathManager; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiReference; +import com.intellij.testFramework.fixtures.BasePlatformTestCase; + +public class ShFunctionResolverInImportedFileTest extends BasePlatformTestCase { + @Override + public void setUp() throws Exception { + super.setUp(); + myFixture.setTestDataPath(PluginPathManager.getPluginHomePath("sh") + "/testData/resolve/imported_file_scope"); + myFixture.copyDirectoryToProject(getTestName(true), ""); + } + + public void testCaseOne() { + doTest(); + } + public void testCaseTwo() { + doTest(); + } + public void testCaseThree() { + doTest(); + } + public void testCaseFour() { + doTest(); + } + public void testCaseFive() { + doTest(); + } + public void testCaseSix() { + doTest("./parent folder/source.sh"); + } + public void testCaseEight() { + doNullTest(); + } + public void testCaseNine() { + doTest(); + } + public void testSameFolder() { + doTest(); + } + public void testWithParams() { + doTest(); + } + public void testCyclicImport() { + doNullTest(); + } + public void testCyclicImportCaseTwo() { + doNullTest(); + } + public void testTransitiveImport() { + doTest(); + } + public void testDotTransitiveImport() { + doTest(); + } + + private void doNullTest() { + myFixture.configureByFile("source.sh"); + PsiReference reference = myFixture.getFile().findReferenceAt(myFixture.getCaretOffset()); + assertNull(reference.resolve()); + } + + private void doTest() { + doTest( "source.sh", "target.sh"); + } + + private void doTest(String filePath) { + doTest( filePath, "target.sh"); + } + + private void doTest(String filePath, String targetFilePath) { + myFixture.configureByFile(filePath); + PsiReference reference = myFixture.getFile().findReferenceAt(myFixture.getCaretOffset()); + PsiElement targetElement = reference.resolve(); + assertNotNull(targetElement); + assertEquals(targetFilePath, targetElement.getContainingFile().getVirtualFile().getName()); + } +} \ No newline at end of file diff --git a/plugins/sh/tests/com/intellij/sh/codeInsight/ShFunctionResolverTest.java b/plugins/sh/tests/com/intellij/sh/codeInsight/ShFunctionResolverTest.java index 7bbdfab26c2b..67ab00760970 100644 --- a/plugins/sh/tests/com/intellij/sh/codeInsight/ShFunctionResolverTest.java +++ b/plugins/sh/tests/com/intellij/sh/codeInsight/ShFunctionResolverTest.java @@ -24,7 +24,7 @@ public class ShFunctionResolverTest extends BasePlatformTestCase { @NotNull @Override protected String getTestDataPath() { - return PluginPathManager.getPluginHomePath("sh") + "/testData/resolve/"; + return PluginPathManager.getPluginHomePath("sh") + "/testData/resolve/file_scope"; } public void testSimpleFunction() {