in intellij-plugin-structure/structure-intellij/src/main/java/com/jetbrains/plugin/structure/intellij/version/IdeVersionImpl.kt [63:131]
fun fromString(version: String): IdeVersionImpl {
if (version.isBlank()) {
throw IllegalArgumentException("Ide-version string must not be empty")
}
if (BUILD_NUMBER == version || SNAPSHOT == version) {
val fallback = fromString(FALLBACK_VERSION)
return IdeVersionImpl("", fallback.components, isSnapshot = true)
}
var code = version
val productSeparator = code.lastIndexOf('-') //some products have multiple parts, e.g. "FB-IC-143.157"
val productCode: String
if (productSeparator > 0) {
productCode = code.substring(0, productSeparator)
code = code.substring(productSeparator + 1)
} else {
productCode = ""
}
validateProductCode(version, productCode)
val baselineVersionSeparator = code.indexOf('.')
val baselineVersion: Int
val buildNumber: Int
if (baselineVersionSeparator > 0) {
val baselineVersionString = code.substring(0, baselineVersionSeparator)
if (baselineVersionString.trim { it <= ' ' }.isEmpty()) {
throw IllegalArgumentException("Invalid version number: $version")
}
val components = code.split('.')
val intComponentsList = ArrayList<Int>()
var isSnapshot = false
for (component in components) {
val comp = parseBuildNumber(version, component)
intComponentsList.add(comp)
if (comp == SNAPSHOT_VALUE) {
if (component == SNAPSHOT) isSnapshot = true
break
}
}
if (intComponentsList.size < 2) {
throw IllegalArgumentException("Invalid version number $version: build not specified")
}
val intComponents = IntArray(intComponentsList.size)
for (i in intComponentsList.indices) {
intComponents[i] = intComponentsList[i]
}
return IdeVersionImpl(productCode, intComponents, isSnapshot = isSnapshot)
} else {
buildNumber = parseBuildNumber(version, code)
if (buildNumber <= 2000) {
// it's probably a baseline, not a build number
return IdeVersionImpl(productCode, intArrayOf(buildNumber, 0))
}
baselineVersion = getBaseLineForHistoricBuilds(buildNumber)
return IdeVersionImpl(productCode, intArrayOf(baselineVersion, buildNumber))
}
}