diff --git a/chapi-ast-c/src/main/antlr/C.g4 b/chapi-ast-c/src/main/antlr/C.g4 index c7fdb889..d1532d26 100644 --- a/chapi-ast-c/src/main/antlr/C.g4 +++ b/chapi-ast-c/src/main/antlr/C.g4 @@ -389,13 +389,11 @@ typeQualifierList ; parameterTypeList - : parameterList - | parameterList ',' '...' + : parameterList (',' '...')? ; parameterList - : parameterDeclaration - | parameterList ',' parameterDeclaration + : parameterDeclaration (',' parameterDeclaration)* ; parameterDeclaration diff --git a/chapi-ast-c/src/main/kotlin/chapi/ast/cast/CAstBaseListener.kt b/chapi-ast-c/src/main/kotlin/chapi/ast/cast/CAstBaseListener.kt index 70012323..c3cc769b 100644 --- a/chapi-ast-c/src/main/kotlin/chapi/ast/cast/CAstBaseListener.kt +++ b/chapi-ast-c/src/main/kotlin/chapi/ast/cast/CAstBaseListener.kt @@ -5,7 +5,7 @@ import chapi.ast.antlr.CParser import chapi.domain.core.* import org.antlr.v4.runtime.ParserRuleContext -open class CAstBaseListener: CBaseListener() { +open class CAstBaseListener : CBaseListener() { fun buildPosition(ctx: ParserRuleContext?): CodePosition { if (ctx == null) { return CodePosition() @@ -13,16 +13,9 @@ open class CAstBaseListener: CBaseListener() { return CodePosition( StartLine = ctx.start.line, - StartLinePosition= ctx.start.charPositionInLine, + StartLinePosition = ctx.start.charPositionInLine, StopLine = ctx.stop.line, StopLinePosition = ctx.stop.charPositionInLine ) } - - fun buildParameters(ctx: CParser.ParameterListContext, parameters: MutableList) { - if (ctx.parameterList() != null) { - buildParameters(ctx.parameterList(), parameters) - } - parameters.add(ctx.parameterDeclaration()) - } } diff --git a/chapi-ast-c/src/main/kotlin/chapi/ast/cast/CFullIdentListener.kt b/chapi-ast-c/src/main/kotlin/chapi/ast/cast/CFullIdentListener.kt index 945f3f77..0f83f98f 100644 --- a/chapi-ast-c/src/main/kotlin/chapi/ast/cast/CFullIdentListener.kt +++ b/chapi-ast-c/src/main/kotlin/chapi/ast/cast/CFullIdentListener.kt @@ -1,6 +1,5 @@ package chapi.ast.cast -import chapi.ast.antlr.CBaseListener import chapi.ast.antlr.CParser import chapi.domain.core.* @@ -74,15 +73,10 @@ open class CFullIdentListener(fileName: String) : CAstBaseListener() { } } - private fun handleParamDirectDeclCtx(ctx: CParser.DirectDeclaratorContext) { - currentFunction.Parameters = listOf() - val directDeclarator = ctx as CParser.ParameterDirectDeclaratorContext + private fun handleParamDirectDeclCtx(ctx: CParser.ParameterDirectDeclaratorContext) { parseDirectDeclarator(ctx.directDeclarator()) - val parameterTypeList = directDeclarator.parameterTypeList().parameterList() - val parameters: MutableList = ArrayList() - this.buildParameters(parameterTypeList, parameters) - + val parameters = ctx.parameterTypeList().parameterList().parameterDeclaration() for (parameter in parameters) { var type: String? = null var name: String? = null @@ -95,6 +89,7 @@ open class CFullIdentListener(fileName: String) : CAstBaseListener() { if (declarator.Identifier().text != null) { name = declarator.Identifier().text } + if (type != null && name != null) { val codeParameter = CodeProperty( TypeValue = name, @@ -105,18 +100,16 @@ open class CFullIdentListener(fileName: String) : CAstBaseListener() { } } - private fun handleFuncPointerDirectDeclCtx(ctx: CParser.DirectDeclaratorContext) { - currentFunction.Parameters = listOf() - var name: String? = null - var type: String? = null - val directDeclarator = ctx as CParser.FunctionPointerDirectDeclaratorContext - if (directDeclarator.typeSpecifier() != null) { - type = directDeclarator.typeSpecifier().text - } - val directDeclaratorType = directDeclarator.directDeclarator()::class.java.simpleName - if (directDeclaratorType == "IdentifierDirectDeclaratorContext") { - name = (directDeclarator.directDeclarator() as CParser.IdentifierDirectDeclaratorContext).Identifier().text + private fun handleFuncPointerDirectDeclCtx(ctx: CParser.FunctionPointerDirectDeclaratorContext) { + val type = ctx.typeSpecifier()?.text + val name = when (val directDeclaratorType = ctx.directDeclarator()) { + is CParser.IdentifierDirectDeclaratorContext -> { + directDeclaratorType.Identifier().text + } + + else -> null } + if (name != null && type != null) { currentFunction.Parameters += CodeProperty( TypeValue = name, @@ -139,19 +132,21 @@ open class CFullIdentListener(fileName: String) : CAstBaseListener() { } parseDirectDeclarator(ctx?.declarator()?.directDeclarator()) - if (currentFunction.Parameters.isNotEmpty()) { - val firstParameter = currentFunction.Parameters[0] - if (firstParameter.TypeType.endsWith('*')) { - val pointerIndex = firstParameter.TypeType.length - 1 - val baseType = firstParameter.TypeType.substring(0, pointerIndex) - structMap.getOrPut(baseType) { - CodeDataStruct(NodeName = baseType) - }.let { - it.Functions += currentFunction - } - } else { - defaultDataStruct.Functions += currentFunction + + if (currentFunction.Parameters.isEmpty()) return + + // handle for pointer + val firstParameter = currentFunction.Parameters[0] + if (firstParameter.TypeType.endsWith('*')) { + val pointerIndex = firstParameter.TypeType.length - 1 + val baseType = firstParameter.TypeType.substring(0, pointerIndex) + structMap.getOrPut(baseType) { + CodeDataStruct(NodeName = baseType) + }.let { + it.Functions += currentFunction } + } else { + defaultDataStruct.Functions += currentFunction } }