Skip to content

Commit 4b06708

Browse files
committed
Added support for "Edit GraphQL fragment" which creates a separate editor window for injected GraphQL (#164)
- Ensured that the in-memory LightVirtualFile in unwrapped to the original file that has a physical path on disk - Updated find closes config to handle LightVirtualFile as well
1 parent 0549565 commit 4b06708

File tree

3 files changed

+33
-4
lines changed

3 files changed

+33
-4
lines changed

src/main/com/intellij/lang/jsgraphql/ide/project/GraphQLPsiSearchHelper.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import com.intellij.psi.search.UsageSearchContext;
4444
import com.intellij.psi.search.scope.packageSet.NamedScope;
4545
import com.intellij.psi.util.PsiTreeUtil;
46+
import com.intellij.testFramework.LightVirtualFile;
4647
import org.apache.commons.compress.utils.IOUtils;
4748
import org.jetbrains.annotations.NotNull;
4849

@@ -143,6 +144,12 @@ private static VirtualFile getVirtualFile(PsiFile containingFile) {
143144
if (virtualFile == null) {
144145
// in memory PsiFile such as the completion PSI
145146
virtualFile = containingFile.getOriginalFile().getVirtualFile();
147+
} else if (virtualFile instanceof LightVirtualFile) {
148+
// in-memory files, e.g. when using "edit GraphQL fragment" on an injected GraphQL tagged template literal
149+
VirtualFile originalFile = ((LightVirtualFile) virtualFile).getOriginalFile();
150+
if (originalFile != null) {
151+
return originalFile;
152+
}
146153
}
147154
return virtualFile;
148155
}

src/main/com/intellij/lang/jsgraphql/ide/project/graphqlconfig/GraphQLConfigManager.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,13 @@ public VirtualFile getClosestIncludingConfigFile(VirtualFile virtualFile) {
189189
* Gets the closest .graphqlconfig{.yml,.yaml} file even though it doesn't include the specified file.
190190
*/
191191
public VirtualFile getClosestConfigFile(VirtualFile virtualFile) {
192+
if (virtualFile instanceof LightVirtualFile) {
193+
VirtualFile originalFile = ((LightVirtualFile) virtualFile).getOriginalFile();
194+
if (originalFile != null) {
195+
// need a path on disk to find the closest config, so use the original physical file if one has been set
196+
virtualFile = originalFile;
197+
}
198+
}
192199
final Set<VirtualFile> contentRoots = getContentRoots(virtualFile);
193200
VirtualFile directory;
194201
if (virtualFile.getFileType() == ScratchFileType.INSTANCE) {
@@ -702,19 +709,20 @@ public GraphQLNamedScope getSchemaScope(VirtualFile virtualFile) {
702709
if (virtualFileWithPath.get().getFileType() != ScratchFileType.INSTANCE) {
703710
if (virtualFileWithPath.get() instanceof LightVirtualFile) {
704711
// handle entry files
712+
final LightVirtualFile inMemoryVirtualFile = (LightVirtualFile) virtualFileWithPath.get();
705713
configBaseDir = null;
706714
for (Map.Entry<VirtualFile, GraphQLConfigData> entry : configPathToConfigurations.entrySet()) {
707715
final GraphQLConfigData configData = entry.getValue();
708716
GraphQLFile entryFile = getConfigurationEntryFile(configData);
709717
boolean found = false;
710-
if (entryFile.getVirtualFile().equals(virtualFileWithPath.get())) {
718+
if (entryFile.getVirtualFile().equals(inMemoryVirtualFile)) {
711719
// the virtual file is an entry file for the specific config base (either the root schema or one of the nested graphql-config project schemas)
712720
configBaseDir = entry.getKey();
713721
found = true;
714722
} else if (configData.projects != null) {
715723
for (Map.Entry<String, GraphQLResolvedConfigData> projectEntry : configData.projects.entrySet()) {
716724
entryFile = getConfigurationEntryFile(projectEntry.getValue());
717-
if (entryFile.getVirtualFile().equals(virtualFileWithPath.get())) {
725+
if (entryFile.getVirtualFile().equals(inMemoryVirtualFile)) {
718726
configBaseDir = entry.getKey();
719727
found = true;
720728
break;
@@ -726,10 +734,13 @@ public GraphQLNamedScope getSchemaScope(VirtualFile virtualFile) {
726734
}
727735
}
728736
if (configBaseDir == null) {
729-
final PsiFile jsonIntrospectionFile = virtualFileWithPath.get().getUserData(GraphQLSchemaKeys.GRAPHQL_INTROSPECTION_SDL_TO_JSON);
737+
final PsiFile jsonIntrospectionFile = inMemoryVirtualFile.getUserData(GraphQLSchemaKeys.GRAPHQL_INTROSPECTION_SDL_TO_JSON);
730738
if (jsonIntrospectionFile != null && jsonIntrospectionFile.getVirtualFile() != null) {
731739
// the file is the SDL derived from a JSON introspection file, so use the JSON file directory to find the associated config
732740
configBaseDir = jsonIntrospectionFile.getVirtualFile().getParent();
741+
} else if(inMemoryVirtualFile.getOriginalFile() != null) {
742+
// editing of injected fragments produce in-memory mapped version of the original file, e.g. editing GraphQL inside a JS as it's own editing window
743+
configBaseDir = inMemoryVirtualFile.getOriginalFile().getParent();
733744
}
734745
}
735746
} else {

src/main/com/intellij/lang/jsgraphql/ide/project/graphqlconfig/GraphQLConfigPackageSet.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import com.intellij.psi.PsiFile;
1818
import com.intellij.psi.search.scope.packageSet.NamedScopesHolder;
1919
import com.intellij.psi.search.scope.packageSet.PackageSet;
20+
import com.intellij.testFramework.LightVirtualFile;
2021
import org.apache.commons.lang.StringUtils;
2122
import org.jetbrains.annotations.NotNull;
2223

@@ -117,7 +118,17 @@ public boolean includesVirtualFile(@NotNull VirtualFile file) {
117118
// the file is the in-memory SDL derived from a JSON introspection file, so it's included if the JSON file is set as the schemaPath
118119
return jsonIntrospectionFile.getVirtualFile().getPath().equals(schemaFilePath);
119120
}
120-
return includesFilePath.computeIfAbsent(file.getPath(), filePath -> {
121+
122+
String inclusionPath = file.getPath();
123+
if (file instanceof LightVirtualFile) {
124+
// the light file is potentially derived from a file on disk, so we should use the physical path to check for inclusion
125+
final VirtualFile originalFile = ((LightVirtualFile) file).getOriginalFile();
126+
if (originalFile != null) {
127+
inclusionPath = originalFile.getPath();
128+
}
129+
}
130+
131+
return includesFilePath.computeIfAbsent(inclusionPath, filePath -> {
121132
if (filePath.equals(schemaFilePath)) {
122133
// fast-path for always including the schema file if present
123134
return true;

0 commit comments

Comments
 (0)