add configuration key to pass android manifest file
This commit is contained in:
committed by
Yan Zhulanow
parent
c6b8cbbb01
commit
376886a9c3
+4
@@ -70,6 +70,10 @@ public class K2JVMCompilerArguments extends CommonCompilerArguments {
|
||||
@ValueDescription("<path>")
|
||||
public String androidRes;
|
||||
|
||||
@Argument(value = "androidManifest", description = "Android manifest file")
|
||||
@ValueDescription("<path>")
|
||||
public String androidManifest;
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public String executableScriptFileName() {
|
||||
|
||||
@@ -54,4 +54,7 @@ public class JVMConfigurationKeys {
|
||||
|
||||
public static final CompilerConfigurationKey<String> ANDROID_RES_PATH =
|
||||
CompilerConfigurationKey.create("android resources search path");
|
||||
|
||||
public static final CompilerConfigurationKey<String> ANDROID_MANIFEST =
|
||||
CompilerConfigurationKey.create("android manifest file");
|
||||
}
|
||||
|
||||
@@ -94,6 +94,10 @@ public class K2JVMCompiler extends CLICompiler<K2JVMCompilerArguments> {
|
||||
configuration.put(JVMConfigurationKeys.ANDROID_RES_PATH, arguments.androidRes);
|
||||
}
|
||||
|
||||
if (arguments.androidManifest != null) {
|
||||
configuration.put(JVMConfigurationKeys.ANDROID_MANIFEST, arguments.androidManifest);
|
||||
}
|
||||
|
||||
if (arguments.script) {
|
||||
if (arguments.freeArgs.isEmpty()) {
|
||||
messageCollector.report(CompilerMessageSeverity.ERROR, "Specify script source path to evaluate",
|
||||
|
||||
@@ -295,8 +295,9 @@ public class JetCoreEnvironment {
|
||||
configuration.getList(CommonConfigurationKeys.SCRIPT_DEFINITIONS_KEY)
|
||||
);
|
||||
|
||||
String s = configuration.get(JVMConfigurationKeys.ANDROID_RES_PATH);
|
||||
project.registerService(AndroidUIXmlProcessor.class, new CliAndroidUIXmlProcessor(project, s));
|
||||
String androidResPath = configuration.get(JVMConfigurationKeys.ANDROID_RES_PATH);
|
||||
String androidManifest = configuration.get(JVMConfigurationKeys.ANDROID_MANIFEST);
|
||||
project.registerService(AndroidUIXmlProcessor.class, new CliAndroidUIXmlProcessor(project, androidResPath, androidManifest));
|
||||
project.registerService(VirtualFileFinderFactory.class, new CliVirtualFileFinderFactory(classPath));
|
||||
}
|
||||
|
||||
|
||||
+1
-37
@@ -21,17 +21,10 @@ import com.intellij.psi.PsiFile
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.openapi.vfs.VirtualFileManager
|
||||
import com.intellij.psi.PsiManager
|
||||
import org.jetbrains.jet.lang.resolve.android.AndroidUIXmlProcessor.NoAndroidManifestFound
|
||||
import java.util.ArrayList
|
||||
import java.io.File
|
||||
import java.io.FileInputStream
|
||||
import javax.xml.parsers.SAXParser
|
||||
import javax.xml.parsers.SAXParserFactory
|
||||
import org.xml.sax.helpers.DefaultHandler
|
||||
import org.xml.sax.Attributes
|
||||
import com.intellij.openapi.vfs.VirtualFile
|
||||
|
||||
open class AndroidResourceManagerBase(project: Project, searchPath: String?) : AndroidResourceManager(project, searchPath) {
|
||||
abstract class AndroidResourceManagerBase(project: Project, searchPath: String?) : AndroidResourceManager(project, searchPath) {
|
||||
override fun getLayoutXmlFiles(): Collection<PsiFile> {
|
||||
val fileManager = VirtualFileManager.getInstance()
|
||||
val watchDir = fileManager.findFileByUrl("file://" + searchPath)
|
||||
@@ -55,33 +48,4 @@ open class AndroidResourceManagerBase(project: Project, searchPath: String?) : A
|
||||
override fun renameProperty(oldName: String, newName: String) {
|
||||
}
|
||||
|
||||
val saxParser: SAXParser = initSAX()
|
||||
|
||||
protected fun initSAX(): SAXParser {
|
||||
val saxFactory = SAXParserFactory.newInstance()
|
||||
saxFactory?.setNamespaceAware(true)
|
||||
return saxFactory!!.newSAXParser()
|
||||
}
|
||||
|
||||
override fun readManifest(): AndroidManifest {
|
||||
try {
|
||||
val manifestXml = File(searchPath!!).getParentFile()!!.getParentFile()!!.listFiles { it.name == "AndroidManifest.xml" }!!.first()
|
||||
var _package: String = ""
|
||||
try {
|
||||
saxParser.parse(FileInputStream(manifestXml), object : DefaultHandler() {
|
||||
override fun startElement(uri: String, localName: String, qName: String, attributes: Attributes) {
|
||||
if (localName == "manifest")
|
||||
_package = attributes.toMap()["package"] ?: ""
|
||||
}
|
||||
})
|
||||
}
|
||||
catch (e: Exception) {
|
||||
throw e
|
||||
}
|
||||
return AndroidManifest(_package)
|
||||
}
|
||||
catch (e: Exception) {
|
||||
throw NoAndroidManifestFound()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+2
-1
@@ -73,12 +73,13 @@ abstract class AndroidUIXmlProcessor(val project: Project) {
|
||||
protected val LOG: Logger = Logger.getInstance(this.javaClass)
|
||||
|
||||
public fun parseToString(): String? {
|
||||
populateQueue()
|
||||
val cacheState = doParse()
|
||||
if (cacheState == null) return null
|
||||
return renderString()
|
||||
}
|
||||
|
||||
public open val resourceManager: AndroidResourceManager = AndroidResourceManagerBase(project, searchPath)
|
||||
public abstract val resourceManager: AndroidResourceManager
|
||||
|
||||
public fun parseToPsi(project: Project): JetFile? {
|
||||
populateQueue()
|
||||
|
||||
+58
@@ -0,0 +1,58 @@
|
||||
/*
|
||||
* Copyright 2010-2014 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.jet.lang.resolve.android
|
||||
|
||||
import com.intellij.openapi.project.Project
|
||||
import java.io.File
|
||||
import java.io.FileInputStream
|
||||
import org.xml.sax.helpers.DefaultHandler
|
||||
import org.xml.sax.Attributes
|
||||
import org.jetbrains.jet.lang.resolve.android.AndroidUIXmlProcessor.NoAndroidManifestFound
|
||||
import javax.xml.parsers.SAXParser
|
||||
import javax.xml.parsers.SAXParserFactory
|
||||
|
||||
public class CliAndroidResourceManager(project: Project, searchPath: String?, val manifestPath: String?) : AndroidResourceManagerBase(project, searchPath) {
|
||||
|
||||
val saxParser: SAXParser = initSAX()
|
||||
|
||||
protected fun initSAX(): SAXParser {
|
||||
val saxFactory = SAXParserFactory.newInstance()
|
||||
saxFactory?.setNamespaceAware(true)
|
||||
return saxFactory!!.newSAXParser()
|
||||
}
|
||||
override fun readManifest(): AndroidManifest {
|
||||
try {
|
||||
val manifestXml = File(manifestPath!!)
|
||||
var _package: String = ""
|
||||
try {
|
||||
saxParser.parse(FileInputStream(manifestXml), object : DefaultHandler() {
|
||||
override fun startElement(uri: String, localName: String, qName: String, attributes: Attributes) {
|
||||
if (localName == "manifest")
|
||||
_package = attributes.toMap()["package"] ?: ""
|
||||
}
|
||||
})
|
||||
}
|
||||
catch (e: Exception) {
|
||||
throw e
|
||||
}
|
||||
return AndroidManifest(_package)
|
||||
}
|
||||
catch (e: Exception) {
|
||||
throw NoAndroidManifestFound()
|
||||
}
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -20,11 +20,11 @@ import java.util.ArrayList
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.psi.PsiFile
|
||||
|
||||
class CliAndroidUIXmlProcessor(project: Project, override val searchPath: String?) : AndroidUIXmlProcessor(project) {
|
||||
class CliAndroidUIXmlProcessor(project: Project, override val searchPath: String?, val manifestPath: String?) : AndroidUIXmlProcessor(project) {
|
||||
|
||||
override var androidAppPackage: String = ""
|
||||
|
||||
override val resourceManager: AndroidResourceManagerBase = AndroidResourceManagerBase(project, searchPath)
|
||||
override val resourceManager = CliAndroidResourceManager(project, searchPath, manifestPath)
|
||||
|
||||
override fun lazySetup() {
|
||||
populateQueue()
|
||||
|
||||
@@ -36,12 +36,14 @@ import java.util.*;
|
||||
|
||||
public class AndroidXmlTest extends TestCaseWithTmpdir {
|
||||
|
||||
private final File singleFileDir = new File(getTestDataPath() + "/converter/singleFile/res/layout/");
|
||||
private static final String singleFilePrefix = getTestDataPath() + "/converter/singleFile/";
|
||||
public static final String singleFileManifestPath = singleFilePrefix + "AndroidManifest.xml";
|
||||
private final File singleFileDir = new File(singleFilePrefix + "res/layout/");
|
||||
private final File fakeActivitySrc = new File(getTestDataPath() + "/fakeHelpers/Activity.kt");
|
||||
private final File fakeViewSrc = new File(getTestDataPath() + "/fakeHelpers/View.kt");
|
||||
private final File fakeWidgetsSrc = new File(getTestDataPath() + "/fakeHelpers/Widgets.kt");
|
||||
private final File fakeMyActivitySrc = new File(getTestDataPath() + "/converter/singleFile/MyActivity.kt");
|
||||
private final String singleFileResPath = getTestDataPath() + "/converter/singleFile/res/layout/";
|
||||
private final File fakeMyActivitySrc = new File(singleFilePrefix + "MyActivity.kt");
|
||||
private final String singleFileResPath = singleFilePrefix + "res/layout/";
|
||||
|
||||
@Override
|
||||
public void setUp() throws Exception {
|
||||
@@ -83,6 +85,7 @@ public class AndroidXmlTest extends TestCaseWithTmpdir {
|
||||
CompilerConfiguration configuration = JetTestUtils.compilerConfigurationForTests(ConfigurationKind.ALL,
|
||||
TestJdkKind.MOCK_JDK);
|
||||
configuration.put(JVMConfigurationKeys.ANDROID_RES_PATH, resPath);
|
||||
configuration.put(JVMConfigurationKeys.ANDROID_MANIFEST, singleFileManifestPath);
|
||||
return JetCoreEnvironment.createForTests(getTestRootDisposable(),
|
||||
configuration);
|
||||
}
|
||||
@@ -106,7 +109,9 @@ public class AndroidXmlTest extends TestCaseWithTmpdir {
|
||||
|
||||
public void testConverterOneFile() throws Exception {
|
||||
JetCoreEnvironment jetCoreEnvironment = getEnvironment(singleFileResPath);
|
||||
AndroidUIXmlProcessor parser = new CliAndroidUIXmlProcessor(jetCoreEnvironment.getProject(), singleFileDir.getAbsolutePath());
|
||||
AndroidUIXmlProcessor parser = new CliAndroidUIXmlProcessor(jetCoreEnvironment.getProject(),
|
||||
singleFileDir.getAbsolutePath(),
|
||||
singleFileManifestPath);
|
||||
|
||||
String actual = parser.parseToString();
|
||||
String expected = loadOrCreate(new File(getTestDataPath() + "/converter/singleFile/layout.kt"), actual);
|
||||
|
||||
Reference in New Issue
Block a user