From d387b5ac320ac88980035bfadab0cee35ee36f70 Mon Sep 17 00:00:00 2001 From: Anton Makeev Date: Thu, 24 Nov 2011 17:51:11 +0100 Subject: [PATCH 1/6] Maven: memory and CPU optimization for indices update --- .../idea/maven/server/MavenServerIndexer.java | 3 +- .../server/MavenServerIndicesProcessor.java | 26 +++ .../embedder/Maven2ServerIndexerImpl.java | 17 +- .../maven/server/Maven3FacadeIndexerImpl.java | 3 +- .../idea/maven/indices/MavenIndex.java | 179 ++++++++++-------- .../maven/server/MavenIndexerWrapper.java | 16 +- .../maven/server/MavenIndicesProcessor.java | 24 +++ .../idea/maven/server/MavenServerManager.java | 25 +++ .../maven/utils/MavenProgressIndicator.java | 12 ++ 9 files changed, 213 insertions(+), 92 deletions(-) create mode 100644 plugins/maven/maven-server-api/src/org/jetbrains/idea/maven/server/MavenServerIndicesProcessor.java create mode 100644 plugins/maven/src/main/java/org/jetbrains/idea/maven/server/MavenIndicesProcessor.java diff --git a/plugins/maven/maven-server-api/src/org/jetbrains/idea/maven/server/MavenServerIndexer.java b/plugins/maven/maven-server-api/src/org/jetbrains/idea/maven/server/MavenServerIndexer.java index 3354a09c19dc..084c7bb878f5 100644 --- a/plugins/maven/maven-server-api/src/org/jetbrains/idea/maven/server/MavenServerIndexer.java +++ b/plugins/maven/maven-server-api/src/org/jetbrains/idea/maven/server/MavenServerIndexer.java @@ -26,7 +26,6 @@ import java.io.File; import java.rmi.Remote; import java.rmi.RemoteException; import java.util.Collection; -import java.util.List; import java.util.Set; public interface MavenServerIndexer extends Remote { @@ -47,7 +46,7 @@ public interface MavenServerIndexer extends Remote { MavenServerIndexerException, MavenServerProcessCanceledException; - List getAllArtifacts(int indexId) throws RemoteException, MavenServerIndexerException; + void processArtifacts(int indexId, MavenServerIndicesProcessor processor) throws RemoteException, MavenServerIndexerException; MavenId addArtifact(int indexId, File artifactFile) throws RemoteException, MavenServerIndexerException; diff --git a/plugins/maven/maven-server-api/src/org/jetbrains/idea/maven/server/MavenServerIndicesProcessor.java b/plugins/maven/maven-server-api/src/org/jetbrains/idea/maven/server/MavenServerIndicesProcessor.java new file mode 100644 index 000000000000..ed0f50352e5c --- /dev/null +++ b/plugins/maven/maven-server-api/src/org/jetbrains/idea/maven/server/MavenServerIndicesProcessor.java @@ -0,0 +1,26 @@ +/* + * Copyright 2000-2011 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.idea.maven.server; + +import org.jetbrains.idea.maven.model.MavenId; + +import java.rmi.Remote; +import java.rmi.RemoteException; +import java.util.Collection; + +public interface MavenServerIndicesProcessor extends Remote { + void processArtifacts(Collection artifacts) throws RemoteException; +} diff --git a/plugins/maven/maven2-server-impl/src/org/jetbrains/idea/maven/server/embedder/Maven2ServerIndexerImpl.java b/plugins/maven/maven2-server-impl/src/org/jetbrains/idea/maven/server/embedder/Maven2ServerIndexerImpl.java index a0608e50613d..dc961e9b5372 100644 --- a/plugins/maven/maven2-server-impl/src/org/jetbrains/idea/maven/server/embedder/Maven2ServerIndexerImpl.java +++ b/plugins/maven/maven2-server-impl/src/org/jetbrains/idea/maven/server/embedder/Maven2ServerIndexerImpl.java @@ -186,11 +186,14 @@ public class Maven2ServerIndexerImpl extends MavenRemoteObject implements MavenS } } - public List getAllArtifacts(int indexId) throws MavenServerIndexerException { + public void processArtifacts(int indexId, MavenServerIndicesProcessor processor) throws MavenServerIndexerException { try { - List result = new ArrayList(); + final int CHUNK_SIZE = 10000; + IndexReader r = getIndex(indexId).getIndexReader(); int total = r.numDocs(); + + List result = new ArrayList(Math.min(CHUNK_SIZE, total)); for (int i = 0; i < total; i++) { if (r.isDeleted(i)) continue; @@ -204,8 +207,16 @@ public class Maven2ServerIndexerImpl extends MavenRemoteObject implements MavenS if (groupId == null || artifactId == null || version == null) continue; result.add(new MavenId(groupId, artifactId, version)); + + if (result.size() == CHUNK_SIZE) { + processor.processArtifacts(result); + result.clear(); + } + } + + if (!result.isEmpty()) { + processor.processArtifacts(result); } - return result; } catch (Exception e) { throw new MavenServerIndexerException(wrapException(e)); diff --git a/plugins/maven/maven3-server-impl/src/org/jetbrains/idea/maven/server/Maven3FacadeIndexerImpl.java b/plugins/maven/maven3-server-impl/src/org/jetbrains/idea/maven/server/Maven3FacadeIndexerImpl.java index 5f656143fd21..c318dfde4662 100644 --- a/plugins/maven/maven3-server-impl/src/org/jetbrains/idea/maven/server/Maven3FacadeIndexerImpl.java +++ b/plugins/maven/maven3-server-impl/src/org/jetbrains/idea/maven/server/Maven3FacadeIndexerImpl.java @@ -25,7 +25,6 @@ import org.jetbrains.idea.maven.model.MavenId; import java.io.File; import java.rmi.RemoteException; import java.util.Collection; -import java.util.List; import java.util.Set; public class Maven3FacadeIndexerImpl extends MavenRemoteObject implements MavenServerIndexer { @@ -55,7 +54,7 @@ public class Maven3FacadeIndexerImpl extends MavenRemoteObject implements MavenS } @Override - public List getAllArtifacts(int indexId) throws RemoteException, MavenServerIndexerException { + public void processArtifacts(int indexId, MavenServerIndicesProcessor processor) throws RemoteException, MavenServerIndexerException { throw new UnsupportedOperationException(); } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenIndex.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenIndex.java index eee6ce7dd687..2287de4b486b 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenIndex.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenIndex.java @@ -27,6 +27,7 @@ import org.jetbrains.idea.maven.model.MavenArtifactInfo; import org.jetbrains.idea.maven.model.MavenId; import org.jetbrains.idea.maven.project.MavenGeneralSettings; import org.jetbrains.idea.maven.server.MavenIndexerWrapper; +import org.jetbrains.idea.maven.server.MavenIndicesProcessor; import org.jetbrains.idea.maven.server.MavenServerIndexerException; import org.jetbrains.idea.maven.utils.MavenLog; import org.jetbrains.idea.maven.utils.MavenProcessCanceledException; @@ -357,37 +358,55 @@ public class MavenIndex { private void doUpdateIndexData(IndexData data, MavenProgressIndicator progress) throws IOException, MavenServerIndexerException { - Set groups = new THashSet(); - Set groupsWithArtifacts = new THashSet(); - Set groupsWithArtifactsWithVersions = new THashSet(); + final Set groups = new THashSet(); + final Set groupsWithArtifacts = new THashSet(); + final Set groupsWithArtifactsWithVersions = new THashSet(); - Map> groupToArtifactMap = new THashMap>(); - Map> groupWithArtifactToVersionMap = new THashMap>(); + final Map> groupToArtifactMap = new THashMap>(); + final Map> groupWithArtifactToVersionMap = new THashMap>(); - List artifacts = data.getAllArtifacts(); - int total = artifacts.size(); - for (int i = 0; i < total; i++) { - progress.setFraction(i / total); - MavenId each = artifacts.get(i); + final StringBuilder builder = new StringBuilder(); - String groupId = each.getGroupId(); - String artifactId = each.getArtifactId(); - String version = each.getVersion(); + progress.pushState(); + progress.setIndeterminate(true); - groups.add(groupId); - groupsWithArtifacts.add(groupId + ":" + artifactId); - groupsWithArtifactsWithVersions.add(groupId + ":" + artifactId + ":" + version); + try { + data.processArtifacts(new MavenIndicesProcessor() { + @Override + public void processArtifacts(Collection artifacts) { + for (MavenId each : artifacts) { + String groupId = each.getGroupId(); + String artifactId = each.getArtifactId(); + String version = each.getVersion(); - getOrCreate(groupToArtifactMap, groupId).add(artifactId); - getOrCreate(groupWithArtifactToVersionMap, groupId + ":" + artifactId).add(version); + builder.setLength(0); + + builder.append(groupId).append(":").append(artifactId); + String ga = builder.toString(); + + builder.append(":").append(version); + String gav = builder.toString(); + + groups.add(groupId); + groupsWithArtifacts.add(ga); + groupsWithArtifactsWithVersions.add(gav); + + getOrCreate(groupToArtifactMap, groupId).add(artifactId); + getOrCreate(groupWithArtifactToVersionMap, ga).add(version); + } + } + }); + + persist(groups, data.groups); + persist(groupsWithArtifacts, data.groupsWithArtifacts); + persist(groupsWithArtifactsWithVersions, data.groupsWithArtifactsWithVersions); + + persist(groupToArtifactMap, data.groupToArtifactMap); + persist(groupWithArtifactToVersionMap, data.groupWithArtifactToVersionMap); + } + finally { + progress.popState(); } - - persist(groups, data.groups); - persist(groupsWithArtifacts, data.groupsWithArtifacts); - persist(groupsWithArtifactsWithVersions, data.groupsWithArtifactsWithVersions); - - persist(groupToArtifactMap, data.groupToArtifactMap); - persist(groupWithArtifactToVersionMap, data.groupWithArtifactToVersionMap); } private Set getOrCreate(Map> map, String key) { @@ -451,32 +470,32 @@ public class MavenIndex { public synchronized void addArtifact(final File artifactFile) { doIndexTask(new IndexTask() { - public Object doTask() throws Exception { - MavenId id = myData.addArtifact(artifactFile); + public Object doTask() throws Exception { + MavenId id = myData.addArtifact(artifactFile); - String groupId = id.getGroupId(); - String artifactId = id.getArtifactId(); - String version = id.getVersion(); + String groupId = id.getGroupId(); + String artifactId = id.getArtifactId(); + String version = id.getVersion(); - myData.groups.enumerate(groupId); - myData.hasGroupCache.put(groupId, true); + myData.groups.enumerate(groupId); + myData.hasGroupCache.put(groupId, true); - String groupWithArtifact = groupId + ":" + artifactId; + String groupWithArtifact = groupId + ":" + artifactId; - myData.groupsWithArtifacts.enumerate(groupWithArtifact); - myData.hasArtifactCache.put(groupWithArtifact, true); - addToCache(myData.groupToArtifactMap, groupId, artifactId); + myData.groupsWithArtifacts.enumerate(groupWithArtifact); + myData.hasArtifactCache.put(groupWithArtifact, true); + addToCache(myData.groupToArtifactMap, groupId, artifactId); - String groupWithArtifactWithVersion = groupWithArtifact + ":" + version; + String groupWithArtifactWithVersion = groupWithArtifact + ":" + version; - myData.groupsWithArtifactsWithVersions.enumerate(groupWithArtifactWithVersion); - myData.hasVersionCache.put(groupWithArtifactWithVersion, true); - addToCache(myData.groupWithArtifactToVersionMap, groupWithArtifact, version); - myData.flush(); + myData.groupsWithArtifactsWithVersions.enumerate(groupWithArtifactWithVersion); + myData.hasVersionCache.put(groupWithArtifactWithVersion, true); + addToCache(myData.groupWithArtifactToVersionMap, groupWithArtifact, version); + myData.flush(); - return null; - } - }, null); + return null; + } + }, null); } private void addToCache(PersistentHashMap> cache, String key, String value) throws IOException { @@ -488,35 +507,35 @@ public class MavenIndex { public synchronized Set getGroupIds() { return doIndexTask(new IndexTask>() { - public Set doTask() throws Exception { - final Set result = new THashSet(); - myData.groups.traverseAllRecords(new PersistentEnumerator.RecordsProcessor() { - public boolean process(int record) throws IOException { - result.add(myData.groups.valueOf(record)); - return true; - } - }); - return result; - } - }, Collections.emptySet()); + public Set doTask() throws Exception { + final Set result = new THashSet(); + myData.groups.traverseAllRecords(new PersistentEnumerator.RecordsProcessor() { + public boolean process(int record) throws IOException { + result.add(myData.groups.valueOf(record)); + return true; + } + }); + return result; + } + }, Collections.emptySet()); } public synchronized Set getArtifactIds(final String groupId) { return doIndexTask(new IndexTask>() { - public Set doTask() throws Exception { - Set result = myData.groupToArtifactMap.get(groupId); - return result == null ? Collections.emptySet() : result; - } - }, Collections.emptySet()); + public Set doTask() throws Exception { + Set result = myData.groupToArtifactMap.get(groupId); + return result == null ? Collections.emptySet() : result; + } + }, Collections.emptySet()); } public synchronized Set getVersions(final String groupId, final String artifactId) { return doIndexTask(new IndexTask>() { - public Set doTask() throws Exception { - Set result = myData.groupWithArtifactToVersionMap.get(groupId + ":" + artifactId); - return result == null ? Collections.emptySet() : result; - } - }, Collections.emptySet()); + public Set doTask() throws Exception { + Set result = myData.groupWithArtifactToVersionMap.get(groupId + ":" + artifactId); + return result == null ? Collections.emptySet() : result; + } + }, Collections.emptySet()); } public synchronized boolean hasGroupId(String groupId) { @@ -540,15 +559,15 @@ public class MavenIndex { if (cached != null) return cached; boolean result = doIndexTask(new IndexTask() { - public Boolean doTask() throws Exception { - return !set.traverseAllRecords(new PersistentEnumerator.RecordsProcessor() { - public boolean process(int record) throws IOException { - if (value.equals(set.valueOf(record))) return false; - return true; - } - }); - } - }, false).booleanValue(); + public Boolean doTask() throws Exception { + return !set.traverseAllRecords(new PersistentEnumerator.RecordsProcessor() { + public boolean process(int record) throws IOException { + if (value.equals(set.valueOf(record))) return false; + return true; + } + }); + } + }, false).booleanValue(); cache.put(value, result); return result; @@ -556,10 +575,10 @@ public class MavenIndex { public synchronized Set search(final Query query, final int maxResult) { return doIndexTask(new IndexTask>() { - public Set doTask() throws Exception { - return myData.search(query, maxResult); - } - }, Collections.emptySet()); + public Set doTask() throws Exception { + return myData.search(query, maxResult); + } + }, Collections.emptySet()); } private T doIndexTask(IndexTask task, T defaultValue) { @@ -675,8 +694,8 @@ public class MavenIndex { groupWithArtifactToVersionMap.force(); } - public List getAllArtifacts() throws MavenServerIndexerException { - return myIndexer.getAllArtifacts(indexId); + public void processArtifacts(MavenIndicesProcessor processor) throws MavenServerIndexerException { + myIndexer.processArtifacts(indexId, processor); } public MavenId addArtifact(File artifactFile) throws MavenServerIndexerException { diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/MavenIndexerWrapper.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/MavenIndexerWrapper.java index 125f1f91ca98..3b49cdea682a 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/MavenIndexerWrapper.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/MavenIndexerWrapper.java @@ -32,7 +32,6 @@ import java.io.File; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; import java.util.Collection; -import java.util.List; import java.util.Set; public abstract class MavenIndexerWrapper extends RemoteObjectWrapper { @@ -118,11 +117,18 @@ public abstract class MavenIndexerWrapper extends RemoteObjectWrapper getAllArtifacts(final int indexId) throws MavenServerIndexerException { - return perform(new IndexRetriable>() { + public void processArtifacts(final int indexId, final MavenIndicesProcessor processor) throws MavenServerIndexerException { + perform(new IndexRetriable() { @Override - public List execute() throws RemoteException, MavenServerIndexerException { - return getOrCreateWrappee().getAllArtifacts(getRemoteId(indexId)); + public Object execute() throws RemoteException, MavenServerIndexerException { + MavenServerIndicesProcessor processorWrapper = MavenServerManager.wrapAndExport(processor); + try { + getOrCreateWrappee().processArtifacts(getRemoteId(indexId), processorWrapper); + } + finally { + UnicastRemoteObject.unexportObject(processorWrapper, true); + } + return null; } }); } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/MavenIndicesProcessor.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/MavenIndicesProcessor.java new file mode 100644 index 000000000000..3faa8402f53a --- /dev/null +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/MavenIndicesProcessor.java @@ -0,0 +1,24 @@ +/* + * Copyright 2000-2011 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.idea.maven.server; + +import org.jetbrains.idea.maven.model.MavenId; + +import java.util.Collection; + +public interface MavenIndicesProcessor { + void processArtifacts(Collection artifacts); +} diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/MavenServerManager.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/MavenServerManager.java index 85cceaeeaba9..6acefbbb5c53 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/MavenServerManager.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/MavenServerManager.java @@ -50,6 +50,7 @@ import org.apache.lucene.search.Query; import org.jdom.Element; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.idea.maven.model.MavenId; import org.jetbrains.idea.maven.model.MavenModel; import org.jetbrains.idea.maven.project.MavenConsole; import org.jetbrains.idea.maven.project.MavenGeneralSettings; @@ -339,6 +340,17 @@ public class MavenServerManager extends RemoteObjectWrapper { } } + public static MavenServerIndicesProcessor wrapAndExport(final MavenIndicesProcessor processor) { + try { + RemoteMavenServerIndicesProcessor result = new RemoteMavenServerIndicesProcessor(processor); + UnicastRemoteObject.exportObject(result, 0); + return result; + } + catch (RemoteException e) { + throw new RuntimeException(e); + } + } + private static class RemoteMavenServerLogger extends MavenRemoteObject implements MavenServerLogger { public void info(Throwable e) { MavenLog.LOG.info(e); @@ -407,4 +419,17 @@ public class MavenServerManager extends RemoteObjectWrapper { myConsole.printMessage(level, message, throwable); } } + + private static class RemoteMavenServerIndicesProcessor extends MavenRemoteObject implements MavenServerIndicesProcessor { + private final MavenIndicesProcessor myProcessor; + + private RemoteMavenServerIndicesProcessor(MavenIndicesProcessor processor) { + myProcessor = processor; + } + + @Override + public void processArtifacts(Collection artifacts) { + myProcessor.processArtifacts(artifacts); + } + } } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenProgressIndicator.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenProgressIndicator.java index 00938237bed2..694f1057cdae 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenProgressIndicator.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenProgressIndicator.java @@ -59,6 +59,18 @@ public class MavenProgressIndicator { myIndicator.setFraction(fraction); } + public synchronized void setIndeterminate(boolean indeterminate) { + myIndicator.setIndeterminate(indeterminate); + } + + public synchronized void pushState() { + myIndicator.pushState(); + } + + public synchronized void popState() { + myIndicator.popState(); + } + public synchronized void cancel() { myIndicator.cancel(); } From 744984ddf7b06f3db7ef76ca515b321175aaa189 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Thu, 24 Nov 2011 16:50:40 +0400 Subject: [PATCH 2/6] do not add compilation listener if it won't do anything --- .../org/jetbrains/android/compiler/AndroidPrecompileTask.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidPrecompileTask.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidPrecompileTask.java index 5a8c09f1a037..f9239975f4e4 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidPrecompileTask.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidPrecompileTask.java @@ -65,7 +65,9 @@ public class AndroidPrecompileTask implements CompileTask { } } - CompilerManager.getInstance(project).addCompilationStatusListener(new MyCompilationStatusListener(project, addedEntries), project); + if (addedEntries.size() > 0) { + CompilerManager.getInstance(project).addCompilationStatusListener(new MyCompilationStatusListener(project, addedEntries), project); + } return true; } From 2b0861962eeb9e9c651aeba7109688f066835d66 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Thu, 24 Nov 2011 19:51:41 +0400 Subject: [PATCH 3/6] IDEA-77437 clean up tests; fix resolving links to lib resources --- .../LocalResourceManager.java | 2 +- .../testData/libModule/highlighting.xml | 4 +- .../testData/libModule/highlighting1.xml | 4 ++ .../testData/libModule/highlighting2.xml | 6 ++ .../dom/AndroidLibraryProjectTest.java | 55 ++++++++++++++++--- 5 files changed, 59 insertions(+), 12 deletions(-) create mode 100644 plugins/android/testData/libModule/highlighting1.xml create mode 100644 plugins/android/testData/libModule/highlighting2.xml diff --git a/plugins/android/src/org/jetbrains/android/resourceManagers/LocalResourceManager.java b/plugins/android/src/org/jetbrains/android/resourceManagers/LocalResourceManager.java index a7fcf23e10e9..d37f4e5b992c 100644 --- a/plugins/android/src/org/jetbrains/android/resourceManagers/LocalResourceManager.java +++ b/plugins/android/src/org/jetbrains/android/resourceManagers/LocalResourceManager.java @@ -103,7 +103,7 @@ public class LocalResourceManager extends ResourceManager { private static void collectResourceDirs(Module module, Set result) { VirtualFile resDir = AndroidRootUtil.getResourceDir(module); - if (resDir == null || !result.add(resDir)) { + if (resDir != null && !result.add(resDir)) { return; } for (AndroidFacet depFacet : AndroidUtils.getAllAndroidDependencies(module, false)) { diff --git a/plugins/android/testData/libModule/highlighting.xml b/plugins/android/testData/libModule/highlighting.xml index 74d7e7439b94..61c7e56e4bfa 100644 --- a/plugins/android/testData/libModule/highlighting.xml +++ b/plugins/android/testData/libModule/highlighting.xml @@ -1,4 +1,4 @@ - -