Create descriptors directly in Android Extensions (IDEA plugin)

This commit is contained in:
Yan Zhulanow
2015-11-06 18:35:29 +03:00
parent d88c2249b8
commit c7f1fd74a1
16 changed files with 131 additions and 948 deletions
@@ -52,15 +52,14 @@ public object AndroidConst {
val IGNORED_XML_WIDGET_TYPES = setOf("requestFocus", "merge", "tag", "check", "blink")
val ESCAPED_IDENTIFIERS = (KtTokens.KEYWORDS.types + KtTokens.SOFT_KEYWORDS.types)
.map { it as? KtKeywordToken }.filterNotNull().map { it.value }.toSet()
val FQNAME_RESOLVE_PACKAGES = listOf("android.widget", "android.webkit", "android.view")
}
public fun idToName(id: String): String? {
public fun androidIdToName(id: String): String? {
for (prefix in AndroidConst.XML_ID_PREFIXES) {
if (id.startsWith(prefix)) return escapeAndroidIdentifier(id.replace(prefix, ""))
if (id.startsWith(prefix)) {
return id.substring(prefix.length)
}
}
return null
}
@@ -69,10 +68,6 @@ public fun isWidgetTypeIgnored(xmlType: String): Boolean {
return (xmlType.isEmpty() || xmlType in AndroidConst.IGNORED_XML_WIDGET_TYPES)
}
fun escapeAndroidIdentifier(id: String): String {
return if (id in AndroidConst.ESCAPED_IDENTIFIERS) "`$id`" else id
}
internal fun <T> List<T>.forEachUntilLast(operation: (T) -> Unit) {
val lastIndex = lastIndex
forEachIndexed { i, t ->
@@ -35,7 +35,7 @@ class AndroidXmlHandler(private val elementCallback: (String, String) -> Unit) :
val attributesMap = attributes.toMap()
val idAttribute = attributesMap[AndroidConst.ID_ATTRIBUTE_NO_NAMESPACE]
val widgetType = attributesMap[AndroidConst.CLASS_ATTRIBUTE_NO_NAMESPACE] ?: localName
val name = idAttribute?.let { idToName(idAttribute) }
val name = idAttribute?.let { androidIdToName(idAttribute) }
if (name != null) elementCallback(name, widgetType)
}