Skip to content

Commit 59e09df

Browse files
committed
Fix caching generated introspection SDL from JSON
1 parent 486f750 commit 59e09df

File tree

3 files changed

+70
-53
lines changed

3 files changed

+70
-53
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package com.intellij.lang.jsgraphql.ide.introspection;
2+
3+
import com.intellij.lang.jsgraphql.GraphQLLanguage;
4+
import com.intellij.lang.jsgraphql.GraphQLSettings;
5+
import com.intellij.lang.jsgraphql.psi.GraphQLFile;
6+
import com.intellij.openapi.diagnostic.Logger;
7+
import com.intellij.openapi.project.Project;
8+
import com.intellij.openapi.vfs.VirtualFile;
9+
import com.intellij.psi.PsiFile;
10+
import com.intellij.psi.PsiFileFactory;
11+
import com.intellij.psi.util.CachedValueProvider;
12+
import com.intellij.psi.util.CachedValuesManager;
13+
import org.jetbrains.annotations.NotNull;
14+
15+
import java.io.IOException;
16+
17+
import static com.intellij.lang.jsgraphql.schema.GraphQLSchemaKeys.*;
18+
19+
public final class GraphQLIntrospectionFilesManager {
20+
21+
private static final Logger LOG = Logger.getInstance(GraphQLIntrospectionFilesManager.class);
22+
23+
private GraphQLIntrospectionFilesManager() {
24+
}
25+
26+
public static @NotNull GraphQLFile getOrCreateIntrospectionSDL(@NotNull VirtualFile file, @NotNull PsiFile psiFile) {
27+
return CachedValuesManager.getCachedValue(psiFile, GRAPHQL_INTROSPECTION_JSON_TO_SDL, () -> {
28+
Project project = psiFile.getProject();
29+
GraphQLSettings settings = GraphQLSettings.getSettings(project);
30+
31+
final String introspectionJsonAsGraphQL =
32+
GraphQLIntrospectionService.getInstance(project).printIntrospectionAsGraphQL(psiFile.getText());
33+
final PsiFileFactory psiFileFactory = PsiFileFactory.getInstance(project);
34+
final String fileName = file.getPath();
35+
final GraphQLFile newIntrospectionFile =
36+
(GraphQLFile) psiFileFactory.createFileFromText(fileName, GraphQLLanguage.INSTANCE, introspectionJsonAsGraphQL);
37+
newIntrospectionFile.putUserData(IS_GRAPHQL_INTROSPECTION_SDL, true);
38+
newIntrospectionFile.putUserData(GRAPHQL_INTROSPECTION_SDL_TO_JSON, psiFile);
39+
newIntrospectionFile.getVirtualFile().putUserData(IS_GRAPHQL_INTROSPECTION_SDL, true);
40+
newIntrospectionFile.getVirtualFile().putUserData(GRAPHQL_INTROSPECTION_SDL_TO_JSON, psiFile);
41+
try {
42+
newIntrospectionFile.getVirtualFile().setWritable(false);
43+
} catch (IOException e) {
44+
LOG.warn(e);
45+
}
46+
47+
return CachedValueProvider.Result.create(newIntrospectionFile, psiFile, settings.getModificationTracker());
48+
});
49+
}
50+
51+
}

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

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,17 @@
1515
import com.intellij.lang.injection.InjectedLanguageManager;
1616
import com.intellij.lang.jsgraphql.GraphQLFileType;
1717
import com.intellij.lang.jsgraphql.GraphQLLanguage;
18-
import com.intellij.lang.jsgraphql.ide.injection.GraphQLInjectionSearchHelper;
19-
import com.intellij.lang.jsgraphql.ide.project.graphqlconfig.GraphQLConfigManager;
18+
import com.intellij.lang.jsgraphql.ide.findUsages.GraphQLFindUsagesUtil;
2019
import com.intellij.lang.jsgraphql.ide.indexing.GraphQLFragmentNameIndex;
2120
import com.intellij.lang.jsgraphql.ide.indexing.GraphQLIdentifierIndex;
22-
import com.intellij.lang.jsgraphql.ide.findUsages.GraphQLFindUsagesUtil;
21+
import com.intellij.lang.jsgraphql.ide.injection.GraphQLInjectionSearchHelper;
22+
import com.intellij.lang.jsgraphql.ide.introspection.GraphQLIntrospectionFilesManager;
23+
import com.intellij.lang.jsgraphql.ide.project.graphqlconfig.GraphQLConfigManager;
2324
import com.intellij.lang.jsgraphql.ide.search.scope.GraphQLMetaInfSchemaSearchScope;
24-
import com.intellij.lang.jsgraphql.psi.*;
25-
import com.intellij.lang.jsgraphql.schema.GraphQLSchemaKeys;
25+
import com.intellij.lang.jsgraphql.psi.GraphQLDefinition;
26+
import com.intellij.lang.jsgraphql.psi.GraphQLFile;
27+
import com.intellij.lang.jsgraphql.psi.GraphQLFragmentDefinition;
28+
import com.intellij.lang.jsgraphql.psi.GraphQLPsiUtil;
2629
import com.intellij.lang.jsgraphql.schema.library.GraphQLLibraryRootsProvider;
2730
import com.intellij.openapi.Disposable;
2831
import com.intellij.openapi.components.ServiceManager;
@@ -37,7 +40,6 @@
3740
import com.intellij.psi.search.GlobalSearchScope;
3841
import com.intellij.psi.search.GlobalSearchScopesCore;
3942
import com.intellij.psi.search.scope.packageSet.NamedScope;
40-
import com.intellij.psi.util.CachedValue;
4143
import com.intellij.psi.util.PsiTreeUtil;
4244
import com.intellij.util.Processor;
4345
import com.intellij.util.indexing.FileBasedIndex;
@@ -237,14 +239,10 @@ public void visitElement(@NotNull PsiElement element) {
237239
return; // no need to visit other elements
238240
}
239241
} else if (element instanceof JsonStringLiteral) {
240-
final CachedValue<GraphQLFile> cachedFile = element.getContainingFile()
241-
.getUserData(GraphQLSchemaKeys.GRAPHQL_INTROSPECTION_JSON_TO_SDL);
242-
if (cachedFile != null && cachedFile.hasUpToDateValue()) {
243-
GraphQLFile graphQLFile = cachedFile.getValue();
244-
if (introspectionFiles.add(graphQLFile)) {
245-
// index the associated introspection SDL from a JSON introspection result file
246-
graphQLFile.accept(identifierVisitor.get());
247-
}
242+
GraphQLFile introspectionSDL = GraphQLIntrospectionFilesManager.getOrCreateIntrospectionSDL(virtualFile, psiFile);
243+
if (introspectionFiles.add(introspectionSDL)) {
244+
// index the associated introspection SDL from a JSON introspection result file
245+
introspectionSDL.accept(identifierVisitor.get());
248246
}
249247
return; // no need to visit deeper
250248
} else if (element instanceof PsiLanguageInjectionHost) {

src/main/com/intellij/lang/jsgraphql/schema/GraphQLRegistryProvider.java

Lines changed: 7 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,10 @@
1010
import com.google.common.collect.Maps;
1111
import com.intellij.json.JsonFileType;
1212
import com.intellij.lang.jsgraphql.GraphQLFileType;
13-
import com.intellij.lang.jsgraphql.GraphQLLanguage;
14-
import com.intellij.lang.jsgraphql.GraphQLSettings;
1513
import com.intellij.lang.jsgraphql.endpoint.ide.project.JSGraphQLEndpointNamedTypeRegistry;
16-
import com.intellij.lang.jsgraphql.ide.introspection.GraphQLIntrospectionService;
14+
import com.intellij.lang.jsgraphql.ide.introspection.GraphQLIntrospectionFilesManager;
1715
import com.intellij.lang.jsgraphql.ide.project.graphqlconfig.GraphQLConfigManager;
1816
import com.intellij.lang.jsgraphql.ide.search.GraphQLPsiSearchHelper;
19-
import com.intellij.lang.jsgraphql.psi.GraphQLFile;
2017
import com.intellij.lang.jsgraphql.psi.GraphQLPsiUtil;
2118
import com.intellij.lang.jsgraphql.types.GraphQLException;
2219
import com.intellij.lang.jsgraphql.types.InvalidSyntaxError;
@@ -31,35 +28,28 @@
3128
import com.intellij.openapi.vfs.VirtualFile;
3229
import com.intellij.psi.PsiElement;
3330
import com.intellij.psi.PsiFile;
34-
import com.intellij.psi.PsiFileFactory;
3531
import com.intellij.psi.PsiManager;
3632
import com.intellij.psi.search.FileTypeIndex;
3733
import com.intellij.psi.search.GlobalSearchScope;
38-
import com.intellij.psi.util.CachedValueProvider;
39-
import com.intellij.psi.util.CachedValuesManager;
4034
import com.intellij.util.TimeoutUtil;
4135
import org.jetbrains.annotations.NotNull;
4236

43-
import java.io.IOException;
4437
import java.util.ArrayList;
4538
import java.util.Collections;
4639
import java.util.List;
4740
import java.util.Map;
4841

49-
import static com.intellij.lang.jsgraphql.schema.GraphQLSchemaKeys.*;
50-
5142
public class GraphQLRegistryProvider implements Disposable {
5243

5344
private static final Logger LOG = Logger.getInstance(GraphQLRegistryProvider.class);
5445

5546
private final GraphQLPsiSearchHelper graphQLPsiSearchHelper;
56-
private final Project project;
47+
private final Project myProject;
5748
private final GlobalSearchScope graphQLFilesScope;
5849
private final GlobalSearchScope jsonIntrospectionScope;
5950
private final PsiManager psiManager;
6051
private final JSGraphQLEndpointNamedTypeRegistry graphQLEndpointNamedTypeRegistry;
6152
private final GraphQLConfigManager graphQLConfigManager;
62-
private final GraphQLSettings mySettings;
6353

6454
private final Map<GlobalSearchScope, GraphQLRegistryInfo> scopeToRegistry = Maps.newConcurrentMap();
6555

@@ -68,15 +58,14 @@ public static GraphQLRegistryProvider getInstance(@NotNull Project project) {
6858
}
6959

7060
public GraphQLRegistryProvider(Project project) {
71-
this.project = project;
61+
myProject = project;
7262
graphQLFilesScope = GlobalSearchScope.getScopeRestrictedByFileTypes(GlobalSearchScope.allScope(project), GraphQLFileType.INSTANCE);
7363
jsonIntrospectionScope = GlobalSearchScope
7464
.getScopeRestrictedByFileTypes(GlobalSearchScope.projectScope(project), JsonFileType.INSTANCE);
7565
psiManager = PsiManager.getInstance(project);
7666
graphQLEndpointNamedTypeRegistry = JSGraphQLEndpointNamedTypeRegistry.getService(project);
7767
graphQLPsiSearchHelper = GraphQLPsiSearchHelper.getInstance(project);
7868
graphQLConfigManager = GraphQLConfigManager.getService(project);
79-
mySettings = GraphQLSettings.getSettings(project);
8069

8170
project.getMessageBus().connect(this).subscribe(GraphQLSchemaChangeTracker.TOPIC, scopeToRegistry::clear);
8271
}
@@ -140,9 +129,9 @@ public GraphQLRegistryInfo getRegistryInfo(@NotNull PsiElement scopedElement) {
140129

141130
}
142131

143-
private boolean processJsonFile(GraphQLSchemaDocumentProcessor processor,
144-
VirtualFile file,
145-
List<GraphQLException> errors) {
132+
private boolean processJsonFile(@NotNull GraphQLSchemaDocumentProcessor processor,
133+
@NotNull VirtualFile file,
134+
@NotNull List<GraphQLException> errors) {
146135
// only JSON files that are directly referenced as "schemaPath" from the .graphqlconfig will be
147136
// considered within scope, so we can just go ahead and try to turn the JSON into GraphQL
148137
final PsiFile psiFile = psiManager.findFile(file);
@@ -151,28 +140,7 @@ private boolean processJsonFile(GraphQLSchemaDocumentProcessor processor,
151140
}
152141

153142
try {
154-
synchronized (GRAPHQL_INTROSPECTION_JSON_TO_SDL) {
155-
GraphQLFile introspectionSDL = CachedValuesManager.getCachedValue(psiFile, GRAPHQL_INTROSPECTION_JSON_TO_SDL, () -> {
156-
final String introspectionJsonAsGraphQL =
157-
GraphQLIntrospectionService.getInstance(project).printIntrospectionAsGraphQL(psiFile.getText());
158-
final PsiFileFactory psiFileFactory = PsiFileFactory.getInstance(project);
159-
final String fileName = file.getPath();
160-
final GraphQLFile newIntrospectionFile =
161-
(GraphQLFile) psiFileFactory.createFileFromText(fileName, GraphQLLanguage.INSTANCE, introspectionJsonAsGraphQL);
162-
newIntrospectionFile.putUserData(IS_GRAPHQL_INTROSPECTION_SDL, true);
163-
newIntrospectionFile.putUserData(GRAPHQL_INTROSPECTION_SDL_TO_JSON, psiFile);
164-
newIntrospectionFile.getVirtualFile().putUserData(IS_GRAPHQL_INTROSPECTION_SDL, true);
165-
newIntrospectionFile.getVirtualFile().putUserData(GRAPHQL_INTROSPECTION_SDL_TO_JSON, psiFile);
166-
try {
167-
newIntrospectionFile.getVirtualFile().setWritable(false);
168-
} catch (IOException e) {
169-
LOG.warn(e);
170-
}
171-
return CachedValueProvider.Result.create(newIntrospectionFile, psiFile, mySettings.getModificationTracker());
172-
});
173-
174-
processor.process(introspectionSDL);
175-
}
143+
processor.process(GraphQLIntrospectionFilesManager.getOrCreateIntrospectionSDL(file, psiFile));
176144
} catch (ProcessCanceledException e) {
177145
throw e;
178146
} catch (SchemaProblem e) {

0 commit comments

Comments
 (0)