Don't reparse headers when collecting macro names
This commit is contained in:
committed by
SvyatoslavScherbina
parent
27a31167e6
commit
f9346f5d5c
+2
-1
@@ -913,7 +913,6 @@ internal class NativeIndexImpl(val library: NativeLibrary, val verbose: Boolean
|
||||
fun buildNativeIndexImpl(library: NativeLibrary, verbose: Boolean): NativeIndex {
|
||||
val result = NativeIndexImpl(library, verbose)
|
||||
indexDeclarations(result)
|
||||
findMacros(result)
|
||||
return result
|
||||
}
|
||||
|
||||
@@ -955,6 +954,8 @@ private fun indexDeclarations(nativeIndex: NativeIndexImpl) {
|
||||
}
|
||||
CXChildVisitResult.CXChildVisit_Continue
|
||||
}
|
||||
|
||||
findMacros(nativeIndex, translationUnit, headers)
|
||||
} finally {
|
||||
clang_disposeTranslationUnit(translationUnit)
|
||||
}
|
||||
|
||||
+19
-35
@@ -23,8 +23,8 @@ import java.io.File
|
||||
/**
|
||||
* Finds all "macro constants" and registers them as [NativeIndex.constants] in given index.
|
||||
*/
|
||||
internal fun findMacros(nativeIndex: NativeIndexImpl) {
|
||||
val names = collectMacroNames(nativeIndex)
|
||||
internal fun findMacros(nativeIndex: NativeIndexImpl, translationUnit: CXTranslationUnit, headers: Set<CXFile?>) {
|
||||
val names = collectMacroNames(nativeIndex, translationUnit, headers)
|
||||
// TODO: apply user-defined filters.
|
||||
val macros = expandMacros(nativeIndex.library, names, typeConverter = { nativeIndex.convertType(it) })
|
||||
|
||||
@@ -226,42 +226,26 @@ enum class VisitorState {
|
||||
EXPECT_END, INVALID
|
||||
}
|
||||
|
||||
private fun collectMacroNames(nativeIndex: NativeIndexImpl): List<String> {
|
||||
private fun collectMacroNames(nativeIndex: NativeIndexImpl, translationUnit: CXTranslationUnit, headers: Set<CXFile?>): List<String> {
|
||||
val result = mutableSetOf<String>()
|
||||
val index = clang_createIndex(excludeDeclarationsFromPCH = 0, displayDiagnostics = 0)!!
|
||||
try {
|
||||
// Include macros into AST:
|
||||
val options = CXTranslationUnit_DetailedPreprocessingRecord
|
||||
|
||||
val translationUnit = nativeIndex.library.parse(index, options)
|
||||
try {
|
||||
translationUnit.ensureNoCompileErrors()
|
||||
val headers = getFilteredHeaders(nativeIndex, index, translationUnit)
|
||||
|
||||
visitChildren(translationUnit) { cursor, _ ->
|
||||
val file = memScoped {
|
||||
val fileVar = alloc<CXFileVar>()
|
||||
clang_getFileLocation(clang_getCursorLocation(cursor), fileVar.ptr, null, null, null)
|
||||
fileVar.value
|
||||
}
|
||||
|
||||
if (cursor.kind == CXCursorKind.CXCursor_MacroDefinition &&
|
||||
nativeIndex.library.includesDeclaration(cursor) &&
|
||||
file != null && // Builtin macros mostly seem to be useless.
|
||||
file in headers &&
|
||||
canMacroBeConstant(cursor))
|
||||
{
|
||||
val spelling = getCursorSpelling(cursor)
|
||||
result.add(spelling)
|
||||
}
|
||||
CXChildVisitResult.CXChildVisit_Continue
|
||||
}
|
||||
|
||||
} finally {
|
||||
clang_disposeTranslationUnit(translationUnit)
|
||||
visitChildren(translationUnit) { cursor, _ ->
|
||||
val file = memScoped {
|
||||
val fileVar = alloc<CXFileVar>()
|
||||
clang_getFileLocation(clang_getCursorLocation(cursor), fileVar.ptr, null, null, null)
|
||||
fileVar.value
|
||||
}
|
||||
} finally {
|
||||
clang_disposeIndex(index)
|
||||
|
||||
if (cursor.kind == CXCursorKind.CXCursor_MacroDefinition &&
|
||||
nativeIndex.library.includesDeclaration(cursor) &&
|
||||
file != null && // Builtin macros mostly seem to be useless.
|
||||
file in headers &&
|
||||
canMacroBeConstant(cursor))
|
||||
{
|
||||
val spelling = getCursorSpelling(cursor)
|
||||
result.add(spelling)
|
||||
}
|
||||
CXChildVisitResult.CXChildVisit_Continue
|
||||
}
|
||||
|
||||
return result.toList()
|
||||
|
||||
Reference in New Issue
Block a user