From e2d97aefffd833f2cf913146190f00b91326a009 Mon Sep 17 00:00:00 2001 From: irengrig Date: Wed, 20 Jul 2016 14:12:12 +0200 Subject: [PATCH] WEB-19898 Add code completion for eslintrc section inside package.json file --- .../extension/JsonSchemaFileProvider.java | 2 + .../JsonSchemaImportedProviderFactory.java | 5 ++ .../JsonSchemaProjectSelfProviderFactory.java | 5 ++ .../jsonSchema/impl/JsonSchemaReader.java | 15 +++- .../impl/JsonSchemaServiceImpl.java | 77 ++++++++++--------- .../jsonSchema/JsonSchemaTestProvider.java | 5 ++ 6 files changed, 69 insertions(+), 40 deletions(-) diff --git a/json/src/com/jetbrains/jsonSchema/extension/JsonSchemaFileProvider.java b/json/src/com/jetbrains/jsonSchema/extension/JsonSchemaFileProvider.java index 2f94b81ed6dd..96b7ce7bdd2d 100644 --- a/json/src/com/jetbrains/jsonSchema/extension/JsonSchemaFileProvider.java +++ b/json/src/com/jetbrains/jsonSchema/extension/JsonSchemaFileProvider.java @@ -14,4 +14,6 @@ public interface JsonSchemaFileProvider { VirtualFile getSchemaFile(); SchemaType getSchemaType(); + + int getOrder(); } diff --git a/json/src/com/jetbrains/jsonSchema/extension/JsonSchemaImportedProviderFactory.java b/json/src/com/jetbrains/jsonSchema/extension/JsonSchemaImportedProviderFactory.java index 9e8dafa1f9e1..7883df39f83e 100644 --- a/json/src/com/jetbrains/jsonSchema/extension/JsonSchemaImportedProviderFactory.java +++ b/json/src/com/jetbrains/jsonSchema/extension/JsonSchemaImportedProviderFactory.java @@ -75,6 +75,11 @@ public class JsonSchemaImportedProviderFactory implements JsonSchemaProviderFact return SchemaType.userSchema; } + @Override + public int getOrder() { + return 1000; + } + @NotNull @Override public String getName() { diff --git a/json/src/com/jetbrains/jsonSchema/extension/JsonSchemaProjectSelfProviderFactory.java b/json/src/com/jetbrains/jsonSchema/extension/JsonSchemaProjectSelfProviderFactory.java index cb76f288228f..a4366664e4d1 100644 --- a/json/src/com/jetbrains/jsonSchema/extension/JsonSchemaProjectSelfProviderFactory.java +++ b/json/src/com/jetbrains/jsonSchema/extension/JsonSchemaProjectSelfProviderFactory.java @@ -67,5 +67,10 @@ public class JsonSchemaProjectSelfProviderFactory implements JsonSchemaProviderF public SchemaType getSchemaType() { return SchemaType.schema; } + + @Override + public int getOrder() { + return -1000; + } } } diff --git a/json/src/com/jetbrains/jsonSchema/impl/JsonSchemaReader.java b/json/src/com/jetbrains/jsonSchema/impl/JsonSchemaReader.java index eeeba1384a49..4a9b4dd406f5 100644 --- a/json/src/com/jetbrains/jsonSchema/impl/JsonSchemaReader.java +++ b/json/src/com/jetbrains/jsonSchema/impl/JsonSchemaReader.java @@ -93,6 +93,7 @@ public class JsonSchemaReader { }; final HashMap map = new HashMap<>(); + map.put("", object); final Map definitions = object.getDefinitions(); if (definitions != null && !definitions.isEmpty()) { map.putAll(convertor.convert("#/definitions/", definitions)); @@ -160,11 +161,17 @@ public class JsonSchemaReader { @NotNull String ref, @Nullable JsonSchemaExportedDefinitions definitions) { if (!ref.startsWith("#/")) { - int idx = ref.indexOf("#/"); - if (idx == -1) throw new RuntimeException("Non-relative or erroneous reference: " + ref); if (definitions == null || key == null) return null; - final String url = ref.substring(0, idx); - final String relative = ref.substring(idx); + int idx = ref.indexOf("#/"); + final String url; + final String relative; + if (idx == -1) { + url = ref.endsWith("#") ? ref.substring(0, ref.length() - 1) : ref; + relative = ""; + } else { + url = ref.substring(0, idx); + relative = ref.substring(idx); + } return definitions.findDefinition(key, url, relative); } return null; diff --git a/json/src/com/jetbrains/jsonSchema/impl/JsonSchemaServiceImpl.java b/json/src/com/jetbrains/jsonSchema/impl/JsonSchemaServiceImpl.java index 52684e0058c8..5812d8701b2f 100644 --- a/json/src/com/jetbrains/jsonSchema/impl/JsonSchemaServiceImpl.java +++ b/json/src/com/jetbrains/jsonSchema/impl/JsonSchemaServiceImpl.java @@ -43,6 +43,12 @@ import java.util.*; public class JsonSchemaServiceImpl implements JsonSchemaServiceEx { private static final Logger LOGGER = Logger.getInstance(JsonSchemaServiceImpl.class); private static final Logger RARE_LOGGER = RareLogger.wrap(LOGGER, false); + public static final Comparator FILE_PROVIDER_COMPARATOR = new Comparator() { + @Override + public int compare(JsonSchemaFileProvider o1, JsonSchemaFileProvider o2) { + return Integer.compare(o1.getOrder(), o2.getOrder()); + } + }; @NotNull private final Project myProject; private final Object myLock; @@ -57,7 +63,7 @@ public class JsonSchemaServiceImpl implements JsonSchemaServiceEx { myDefinitions = new JsonSchemaExportedDefinitions(this::iterateSchemas); ApplicationManager .getApplication().getMessageBus().connect(project).subscribe(VirtualFileManager.VFS_CHANGES, new JsonSchemaVfsListener(project, this)); - ensureSchemaFiles(project); + ensureSchemaFiles(); } @NotNull @@ -65,6 +71,15 @@ public class JsonSchemaServiceImpl implements JsonSchemaServiceEx { return JsonSchemaProviderFactory.EP_NAME.getExtensions(); } + private List getProviders() { + final List providers = new ArrayList<>(); + for (JsonSchemaProviderFactory factory : getProviderFactories()) { + providers.addAll(factory.getProviders(myProject)); + } + Collections.sort(providers, FILE_PROVIDER_COMPARATOR); + return providers; + } + @Nullable public Annotator getAnnotator(@Nullable VirtualFile file) { @@ -86,22 +101,18 @@ public class JsonSchemaServiceImpl implements JsonSchemaServiceEx { @Override public boolean isRegisteredSchemaFile(@NotNull Project project, @NotNull VirtualFile file) { if (!initialized) { - ensureSchemaFiles(project); + ensureSchemaFiles(); } return mySchemaFiles.contains(file); } - private void ensureSchemaFiles(@NotNull final Project project) { + private void ensureSchemaFiles() { synchronized (myLock) { if (!initialized) { - final JsonSchemaProviderFactory[] factories = getProviderFactories(); - for (JsonSchemaProviderFactory factory : factories) { - final List providers = factory.getProviders(project); - for (JsonSchemaFileProvider provider : providers) { - final VirtualFile schemaFile = provider.getSchemaFile(); - if (schemaFile != null) { - mySchemaFiles.add(schemaFile); - } + for (JsonSchemaFileProvider provider : getProviders()) { + final VirtualFile schemaFile = provider.getSchemaFile(); + if (schemaFile != null) { + mySchemaFiles.add(schemaFile); } } initialized = true; @@ -226,17 +237,14 @@ public class JsonSchemaServiceImpl implements JsonSchemaServiceEx { } public void iterateSchemas(@NotNull final PairConsumer> consumer) { - final JsonSchemaProviderFactory[] factories = getProviderFactories(); - for (JsonSchemaProviderFactory factory : factories) { - for (JsonSchemaFileProvider provider : factory.getProviders(myProject)) { - consumer.consume(provider.getSchemaFile(), - new NullableLazyValue() { - @Override - protected JsonSchemaObject compute() { - return readObject(provider, null); - } - }); - } + for (JsonSchemaFileProvider provider : getProviders()) { + consumer.consume(provider.getSchemaFile(), + new NullableLazyValue() { + @Override + protected JsonSchemaObject compute() { + return readObject(provider, null); + } + }); } } @@ -255,22 +263,19 @@ public class JsonSchemaServiceImpl implements JsonSchemaServiceEx { private List getWrappers(@Nullable VirtualFile file) { if (file == null) return null; final List wrappers = new ArrayList<>(); - JsonSchemaProviderFactory[] factories = getProviderFactories(); synchronized (myLock) { final Set files = mySchemaFiles.isEmpty() ? new HashSet<>() : null; - for (JsonSchemaProviderFactory factory : factories) { - for (JsonSchemaFileProvider provider : factory.getProviders(myProject)) { - final VirtualFile key = provider.getSchemaFile(); - if (files != null) files.add(key); - if (provider.isAvailable(myProject, file)) { - JsonSchemaObjectCodeInsightWrapper wrapper = myWrappers.get(key); - if (wrapper == null) { - wrapper = createWrapper(provider); - if (wrapper == null) return null; - myWrappers.putIfAbsent(key, wrapper); - } - wrappers.add(wrapper); + for (JsonSchemaFileProvider provider : getProviders()) { + final VirtualFile key = provider.getSchemaFile(); + if (files != null) files.add(key); + if (provider.isAvailable(myProject, file)) { + JsonSchemaObjectCodeInsightWrapper wrapper = myWrappers.get(key); + if (wrapper == null) { + wrapper = createWrapper(provider); + if (wrapper == null) return null; + myWrappers.putIfAbsent(key, wrapper); } + wrappers.add(wrapper); } } if (files != null) mySchemaFiles.addAll(files); @@ -354,7 +359,7 @@ public class JsonSchemaServiceImpl implements JsonSchemaServiceEx { @Override public Set getSchemaFiles() { if (!initialized) { - ensureSchemaFiles(myProject); + ensureSchemaFiles(); } return Collections.unmodifiableSet(mySchemaFiles); } diff --git a/json/tests/test/com/jetbrains/jsonSchema/JsonSchemaTestProvider.java b/json/tests/test/com/jetbrains/jsonSchema/JsonSchemaTestProvider.java index 9c9b27ad3ddf..e598f876b197 100644 --- a/json/tests/test/com/jetbrains/jsonSchema/JsonSchemaTestProvider.java +++ b/json/tests/test/com/jetbrains/jsonSchema/JsonSchemaTestProvider.java @@ -36,4 +36,9 @@ public class JsonSchemaTestProvider implements JsonSchemaFileProvider { public SchemaType getSchemaType() { return SchemaType.userSchema; } + + @Override + public int getOrder() { + return 10; + } }