WEB-19898 Add code completion for eslintrc section inside package.json file

This commit is contained in:
irengrig
2016-07-20 14:14:32 +02:00
parent 715fd9c8a2
commit e2d97aefff
6 changed files with 69 additions and 40 deletions
@@ -14,4 +14,6 @@ public interface JsonSchemaFileProvider {
VirtualFile getSchemaFile();
SchemaType getSchemaType();
int getOrder();
}
@@ -75,6 +75,11 @@ public class JsonSchemaImportedProviderFactory implements JsonSchemaProviderFact
return SchemaType.userSchema;
}
@Override
public int getOrder() {
return 1000;
}
@NotNull
@Override
public String getName() {
@@ -67,5 +67,10 @@ public class JsonSchemaProjectSelfProviderFactory implements JsonSchemaProviderF
public SchemaType getSchemaType() {
return SchemaType.schema;
}
@Override
public int getOrder() {
return -1000;
}
}
}
@@ -93,6 +93,7 @@ public class JsonSchemaReader {
};
final HashMap<String, JsonSchemaObject> map = new HashMap<>();
map.put("", object);
final Map<String, JsonSchemaObject> 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;
@@ -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<JsonSchemaFileProvider> FILE_PROVIDER_COMPARATOR = new Comparator<JsonSchemaFileProvider>() {
@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<JsonSchemaFileProvider> getProviders() {
final List<JsonSchemaFileProvider> 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<JsonSchemaFileProvider> 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<VirtualFile, NullableLazyValue<JsonSchemaObject>> consumer) {
final JsonSchemaProviderFactory[] factories = getProviderFactories();
for (JsonSchemaProviderFactory factory : factories) {
for (JsonSchemaFileProvider provider : factory.getProviders(myProject)) {
consumer.consume(provider.getSchemaFile(),
new NullableLazyValue<JsonSchemaObject>() {
@Override
protected JsonSchemaObject compute() {
return readObject(provider, null);
}
});
}
for (JsonSchemaFileProvider provider : getProviders()) {
consumer.consume(provider.getSchemaFile(),
new NullableLazyValue<JsonSchemaObject>() {
@Override
protected JsonSchemaObject compute() {
return readObject(provider, null);
}
});
}
}
@@ -255,22 +263,19 @@ public class JsonSchemaServiceImpl implements JsonSchemaServiceEx {
private List<JsonSchemaObjectCodeInsightWrapper> getWrappers(@Nullable VirtualFile file) {
if (file == null) return null;
final List<JsonSchemaObjectCodeInsightWrapper> wrappers = new ArrayList<>();
JsonSchemaProviderFactory[] factories = getProviderFactories();
synchronized (myLock) {
final Set<VirtualFile> 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<VirtualFile> getSchemaFiles() {
if (!initialized) {
ensureSchemaFiles(myProject);
ensureSchemaFiles();
}
return Collections.unmodifiableSet(mySchemaFiles);
}
@@ -36,4 +36,9 @@ public class JsonSchemaTestProvider implements JsonSchemaFileProvider {
public SchemaType getSchemaType() {
return SchemaType.userSchema;
}
@Override
public int getOrder() {
return 10;
}
}