Only report locations without a source offset in non-source files

Also adjust tests that would otherwise report types with locations outside the source tree (i.e., for the most part in the standard library)
This commit is contained in:
Chris Smowton
2021-11-15 16:23:52 +00:00
committed by Ian Lynagh
parent c2fef58b21
commit bde4534050
12 changed files with 1918 additions and 4543 deletions

View File

@@ -350,9 +350,9 @@ open class KotlinUsesExtractor(
val newTrapWriter =
if (isExternalDeclaration(cls) || clsFile == null)
tw.withTargetFile(getIrClassBinaryPath(cls), NullSourceOffsetResolver, populateFileTables)
tw.withTargetFile(getIrClassBinaryPath(cls), null, populateFileTables)
else
tw.withTargetFile(clsFile.path, FileSourceOffsetResolver(clsFile.fileEntry))
tw.withTargetFile(clsFile.path, clsFile.fileEntry)
return KotlinUsesExtractor(logger, newTrapWriter, dependencyCollector, externalClassExtractor, pluginContext)
}

View File

@@ -82,44 +82,29 @@ open class TrapWriter (val lm: TrapLabelManager, val bw: BufferedWriter) {
* Gets a FileTrapWriter like this one (using the same label manager, writer etc), but with the given
* default file used in getLocation etc.
*/
fun withTargetFile(filePath: String, sourceOffsetResolver: SourceOffsetResolver, populateFileTables: Boolean = true) =
FileTrapWriter(lm, bw, filePath, sourceOffsetResolver, populateFileTables)
}
abstract class SourceOffsetResolver {
abstract fun getLineNumber(offset: Int): Int
abstract fun getColumnNumber(offset: Int): Int
}
class FileSourceOffsetResolver(val fileEntry: IrFileEntry) : SourceOffsetResolver() {
override fun getLineNumber(offset: Int) = fileEntry.getLineNumber(offset)
override fun getColumnNumber(offset: Int) = fileEntry.getColumnNumber(offset)
}
object NullSourceOffsetResolver : SourceOffsetResolver() {
override fun getLineNumber(offset: Int) = 0
override fun getColumnNumber(offset: Int) = 0
fun withTargetFile(filePath: String, fileEntry: IrFileEntry?, populateFileTables: Boolean = true) =
FileTrapWriter(lm, bw, filePath, fileEntry, populateFileTables)
}
class SourceFileTrapWriter (
lm: TrapLabelManager,
bw: BufferedWriter,
irFile: IrFile) :
FileTrapWriter(lm, bw, irFile.path, FileSourceOffsetResolver(irFile.fileEntry)) {
FileTrapWriter(lm, bw, irFile.path, irFile.fileEntry) {
}
class ClassFileTrapWriter (
lm: TrapLabelManager,
bw: BufferedWriter,
filePath: String) :
FileTrapWriter(lm, bw, filePath, NullSourceOffsetResolver) {
FileTrapWriter(lm, bw, filePath, null) {
}
open class FileTrapWriter (
lm: TrapLabelManager,
bw: BufferedWriter,
val filePath: String,
val sourceOffsetResolver: SourceOffsetResolver,
val sourceFileEntry: IrFileEntry?,
populateFileTables: Boolean = true
): TrapWriter (lm, bw) {
val populateFile = PopulateFile(this)
@@ -140,26 +125,33 @@ open class FileTrapWriter (
}
fun getLocation(startOffset: Int, endOffset: Int): Label<DbLocation> {
// If the compiler doesn't have a location, then start and end are both -1
val unknownLoc = startOffset == -1 && endOffset == -1
// If this is the location for a compiler-generated element, then it will
// be a zero-width location. QL doesn't support these, so we translate it
// into a one-width location.
val zeroWidthLoc = !unknownLoc && startOffset == endOffset
val startLine = if(unknownLoc) 0 else sourceOffsetResolver.getLineNumber(startOffset) + 1
val startColumn = if(unknownLoc) 0 else sourceOffsetResolver.getColumnNumber(startOffset) + 1
val endLine = if(unknownLoc) 0 else sourceOffsetResolver.getLineNumber(endOffset) + 1
val endColumn = if(unknownLoc) 0 else sourceOffsetResolver.getColumnNumber(endOffset)
val endColumn2 = if(zeroWidthLoc) endColumn + 1 else endColumn
return getLocation(fileId, startLine, startColumn, endLine, endColumn2)
// If this isn't a source file (sourceFileEntry is null), then nothing has
// a source location: we report the source .class file regardless.
if((startOffset == -1 && endOffset == -1) || sourceFileEntry == null) {
val reportFileId = if (sourceFileEntry == null) fileId else unknownFileId
return getLocation(reportFileId, 0, 0, 0, 0)
} else {
// If this is the location for a compiler-generated element, then it will
// be a zero-width location. QL doesn't support these, so we translate it
// into a one-width location.
val endColumnOffset = if (startOffset == endOffset) 1 else 0
return getLocation(
fileId,
sourceFileEntry.getLineNumber(startOffset) + 1,
sourceFileEntry.getColumnNumber(startOffset) + 1,
sourceFileEntry.getLineNumber(endOffset) + 1,
sourceFileEntry.getColumnNumber(endOffset) + endColumnOffset
)
}
}
fun getLocationString(e: IrElement): String {
if (e.startOffset == -1 && e.endOffset == -1) {
if ((e.startOffset == -1 && e.endOffset == -1) || sourceFileEntry == null) {
return "unknown location, while processing $filePath"
} else {
val startLine = sourceOffsetResolver.getLineNumber(e.startOffset) + 1
val startColumn = sourceOffsetResolver.getColumnNumber(e.startOffset) + 1
val endLine = sourceOffsetResolver.getLineNumber(e.endOffset) + 1
val endColumn = sourceOffsetResolver.getColumnNumber(e.endOffset)
val startLine = sourceFileEntry.getLineNumber(e.startOffset) + 1
val startColumn = sourceFileEntry.getColumnNumber(e.startOffset) + 1
val endLine = sourceFileEntry.getLineNumber(e.endOffset) + 1
val endColumn = sourceFileEntry.getColumnNumber(e.endOffset)
return "file://$filePath:$startLine:$startColumn:$endLine:$endColumn"
}
}

View File

@@ -4,9 +4,9 @@ cloneMethods
| file://:0:0:0:0 | clone | clone() | file://:0:0:0:0 | int[] | file://:0:0:0:0 | int[] | file://:0:0:0:0 | Kotlin nullable IntArray |
| file://:0:0:0:0 | clone | clone() | file://:0:0:0:0 | int[][] | file://:0:0:0:0 | int[][] | file://:0:0:0:0 | Kotlin nullable Array<int[]> |
#select
| primitiveArrays.kt:5:12:5:24 | a | file://:0:0:0:0 | Integer[] | file://:0:0:0:0 | Integer | file://:0:0:0:0 | Integer | file://:0:0:0:0 | Kotlin not-null Array<Integer> |
| primitiveArrays.kt:5:27:5:40 | b | file://:0:0:0:0 | Integer[] | file://:0:0:0:0 | Integer | file://:0:0:0:0 | Integer | file://:0:0:0:0 | Kotlin not-null Array<Integer> |
| primitiveArrays.kt:5:43:5:53 | c | file://:0:0:0:0 | int[] | file://:0:0:0:0 | int | file://:0:0:0:0 | int | file://:0:0:0:0 | Kotlin not-null IntArray |
| primitiveArrays.kt:5:56:5:76 | d | file://:0:0:0:0 | Integer[][] | file://:0:0:0:0 | Integer[] | file://:0:0:0:0 | Integer | file://:0:0:0:0 | Kotlin not-null Array<Integer[]> |
| primitiveArrays.kt:5:79:5:98 | e | file://:0:0:0:0 | Integer[][] | file://:0:0:0:0 | Integer[] | file://:0:0:0:0 | Integer | file://:0:0:0:0 | Kotlin not-null Array<Integer[]> |
| primitiveArrays.kt:5:101:5:118 | f | file://:0:0:0:0 | int[][] | file://:0:0:0:0 | int[] | file://:0:0:0:0 | int | file://:0:0:0:0 | Kotlin not-null Array<int[]> |
| primitiveArrays.kt:5:12:5:24 | a | file://:0:0:0:0 | Integer[] | Integer | Integer | file://:0:0:0:0 | Kotlin not-null Array<Integer> |
| primitiveArrays.kt:5:27:5:40 | b | file://:0:0:0:0 | Integer[] | Integer | Integer | file://:0:0:0:0 | Kotlin not-null Array<Integer> |
| primitiveArrays.kt:5:43:5:53 | c | file://:0:0:0:0 | int[] | int | int | file://:0:0:0:0 | Kotlin not-null IntArray |
| primitiveArrays.kt:5:56:5:76 | d | file://:0:0:0:0 | Integer[][] | Integer[] | Integer | file://:0:0:0:0 | Kotlin not-null Array<Integer[]> |
| primitiveArrays.kt:5:79:5:98 | e | file://:0:0:0:0 | Integer[][] | Integer[] | Integer | file://:0:0:0:0 | Kotlin not-null Array<Integer[]> |
| primitiveArrays.kt:5:101:5:118 | f | file://:0:0:0:0 | int[][] | int[] | int | file://:0:0:0:0 | Kotlin not-null Array<int[]> |

View File

@@ -8,7 +8,7 @@ class InterestingParameter extends Parameter {
from InterestingParameter p, Array a, KotlinType ktType
where p.getType() = a and ktType = p.getKotlinType()
select p, a, a.getComponentType(), a.getElementType(), ktType
select p, a, a.getComponentType().toString(), a.getElementType().toString(), ktType
query predicate cloneMethods(Method m, string signature, Array declType, Type returnType, KotlinType ktReturnType) {
any(InterestingParameter p).getType() = declType and

View File

@@ -1,11 +1,11 @@
| classes.kt:2:1:2:18 | ClassOne | file://:0:0:0:0 | Object |
| classes.kt:4:1:6:1 | ClassTwo | file://:0:0:0:0 | Object |
| classes.kt:8:1:10:1 | ClassThree | file://:0:0:0:0 | Object |
| classes.kt:12:1:15:1 | ClassFour | classes.kt:8:1:10:1 | ClassThree |
| classes.kt:17:1:18:1 | ClassFive | classes.kt:12:1:15:1 | ClassFour |
| classes.kt:28:1:30:1 | ClassSix | classes.kt:12:1:15:1 | ClassFour |
| classes.kt:28:1:30:1 | ClassSix | classes.kt:20:1:22:1 | IF1 |
| classes.kt:28:1:30:1 | ClassSix | classes.kt:24:1:26:1 | IF2 |
| classes.kt:34:1:47:1 | ClassSeven | file://:0:0:0:0 | Object |
| classes.kt:49:1:51:1 | Direction | file://:0:0:0:0 | Enum<Direction> |
| classes.kt:53:1:57:1 | Color | file://:0:0:0:0 | Enum<Color> |
| classes.kt:2:1:2:18 | ClassOne | Object |
| classes.kt:4:1:6:1 | ClassTwo | Object |
| classes.kt:8:1:10:1 | ClassThree | Object |
| classes.kt:12:1:15:1 | ClassFour | ClassThree |
| classes.kt:17:1:18:1 | ClassFive | ClassFour |
| classes.kt:28:1:30:1 | ClassSix | ClassFour |
| classes.kt:28:1:30:1 | ClassSix | IF1 |
| classes.kt:28:1:30:1 | ClassSix | IF2 |
| classes.kt:34:1:47:1 | ClassSeven | Object |
| classes.kt:49:1:51:1 | Direction | Enum<Direction> |
| classes.kt:53:1:57:1 | Color | Enum<Color> |

View File

@@ -2,5 +2,5 @@ import java
from Class c
where c.fromSource()
select c, c.getASupertype()
select c, c.getASupertype().toString()

View File

@@ -12,14 +12,14 @@ genericFunction
| generics.kt:15:5:17:5 | f2 | generics.kt:15:10:15:10 | U | 0 |
| generics.kt:21:5:21:23 | f4 | generics.kt:21:10:21:10 | P | 0 |
genericCall
| generics.kt:27:17:27:22 | f2(...) | generics.kt:15:10:15:10 | U | file://:0:0:0:0 | String |
| generics.kt:30:17:30:21 | f2(...) | generics.kt:15:10:15:10 | U | file://:0:0:0:0 | Integer |
| generics.kt:32:8:32:12 | f4(...) | generics.kt:21:10:21:10 | P | file://:0:0:0:0 | Integer |
| generics.kt:27:17:27:22 | f2(...) | generics.kt:15:10:15:10 | U | String |
| generics.kt:30:17:30:21 | f2(...) | generics.kt:15:10:15:10 | U | Integer |
| generics.kt:32:8:32:12 | f4(...) | generics.kt:21:10:21:10 | P | Integer |
genericCtor
| generics.kt:16:16:16:26 | new C1(...) | 0 | generics.kt:15:10:15:10 | U |
| generics.kt:16:16:16:26 | new C1(...) | 1 | generics.kt:15:10:15:10 | U |
| generics.kt:25:14:25:28 | new C1(...) | 0 | file://:0:0:0:0 | Integer |
| generics.kt:25:14:25:28 | new C1(...) | 1 | file://:0:0:0:0 | Integer |
| generics.kt:28:14:28:32 | new C1(...) | 0 | file://:0:0:0:0 | String |
| generics.kt:28:14:28:32 | new C1(...) | 1 | file://:0:0:0:0 | Integer |
| generics.kt:33:21:33:29 | new C0(...) | 0 | file://:0:0:0:0 | Integer |
| generics.kt:16:16:16:26 | new C1(...) | 0 | U |
| generics.kt:16:16:16:26 | new C1(...) | 1 | U |
| generics.kt:25:14:25:28 | new C1(...) | 0 | Integer |
| generics.kt:25:14:25:28 | new C1(...) | 1 | Integer |
| generics.kt:28:14:28:32 | new C1(...) | 0 | String |
| generics.kt:28:14:28:32 | new C1(...) | 1 | Integer |
| generics.kt:33:21:33:29 | new C0(...) | 0 | Integer |

View File

@@ -15,8 +15,10 @@ query predicate genericFunction(GenericCallable c, TypeVariable tv, int i) {
c.getFile().getExtension() = "kt"
}
query predicate genericCall(GenericCall c, TypeVariable tv, Type t) { c.getATypeArgument(tv) = t }
query predicate genericCtor(ClassInstanceExpr c, int i, Type ta) {
c.getTypeArgument(i).getType() = ta
query predicate genericCall(GenericCall c, TypeVariable tv, string t) {
c.getATypeArgument(tv).toString() = t
}
query predicate genericCtor(ClassInstanceExpr c, int i, string ta) {
c.getTypeArgument(i).getType().toString() = ta
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,5 @@
import java
from Type t
select t, concat(t.getAPrimaryQlClass(), ", ")
select t.toString(), concat(t.getAPrimaryQlClass(), ", ")

View File

@@ -1,11 +1,11 @@
| variables.kt:2:1:8:1 | other | file://:0:0:0:0 | Object | file://:0:0:0:0 | <none> |
| variables.kt:3:5:3:21 | prop | file://:0:0:0:0 | int | variables.kt:3:21:3:21 | 1 |
| variables.kt:5:20:5:29 | param | file://:0:0:0:0 | int | file://:0:0:0:0 | <none> |
| variables.kt:6:9:6:25 | int local | file://:0:0:0:0 | int | variables.kt:6:21:6:25 | ... + ... |
| variables.kt:10:1:10:21 | topLevel | file://:0:0:0:0 | int | file://:0:0:0:0 | <none> |
| variables.kt:12:1:15:1 | other | file://:0:0:0:0 | Object | file://:0:0:0:0 | <none> |
| variables.kt:16:1:34:1 | other | file://:0:0:0:0 | Object | file://:0:0:0:0 | <none> |
| variables.kt:16:11:16:18 | o | variables.kt:12:1:15:1 | C1 | file://:0:0:0:0 | <none> |
| variables.kt:16:11:16:18 | o | variables.kt:12:1:15:1 | C1 | variables.kt:16:11:16:18 | o |
| variables.kt:36:1:45:1 | other | file://:0:0:0:0 | Object | file://:0:0:0:0 | <none> |
| variables.kt:38:11:44:5 | other | file://:0:0:0:0 | Object | file://:0:0:0:0 | <none> |
| variables.kt:2:1:8:1 | other | Object | file://:0:0:0:0 | <none> |
| variables.kt:3:5:3:21 | prop | int | variables.kt:3:21:3:21 | 1 |
| variables.kt:5:20:5:29 | param | int | file://:0:0:0:0 | <none> |
| variables.kt:6:9:6:25 | int local | int | variables.kt:6:21:6:25 | ... + ... |
| variables.kt:10:1:10:21 | topLevel | int | file://:0:0:0:0 | <none> |
| variables.kt:12:1:15:1 | other | Object | file://:0:0:0:0 | <none> |
| variables.kt:16:1:34:1 | other | Object | file://:0:0:0:0 | <none> |
| variables.kt:16:11:16:18 | o | C1 | file://:0:0:0:0 | <none> |
| variables.kt:16:11:16:18 | o | C1 | variables.kt:16:11:16:18 | o |
| variables.kt:36:1:45:1 | other | Object | file://:0:0:0:0 | <none> |
| variables.kt:38:11:44:5 | other | Object | file://:0:0:0:0 | <none> |

View File

@@ -32,5 +32,5 @@ MaybeExpr initializer(Variable v) {
from Variable v
where v.fromSource()
select v, v.getType(), initializer(v)
select v, v.getType().toString(), initializer(v)