未验证 提交 7c37d131 编写于 作者: P Phodal Huang 提交者: GitHub

Merge pull request #4 from cuijinyu/master

test: <c> add function parameters test
......@@ -628,73 +628,73 @@ public class CBaseListener implements CListener {
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterPostStaticAssignmentExpressionDirectDeclarator(CParser.PostStaticAssignmentExpressionDirectDeclaratorContext ctx) { }
@Override public void enterParameterDirectDeclarator(CParser.ParameterDirectDeclaratorContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitPostStaticAssignmentExpressionDirectDeclarator(CParser.PostStaticAssignmentExpressionDirectDeclaratorContext ctx) { }
@Override public void exitParameterDirectDeclarator(CParser.ParameterDirectDeclaratorContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterTypeQualifierListPointerDirectDeclarator(CParser.TypeQualifierListPointerDirectDeclaratorContext ctx) { }
@Override public void enterPostStaticAssignmentExpressionDirectDeclarator(CParser.PostStaticAssignmentExpressionDirectDeclaratorContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitTypeQualifierListPointerDirectDeclarator(CParser.TypeQualifierListPointerDirectDeclaratorContext ctx) { }
@Override public void exitPostStaticAssignmentExpressionDirectDeclarator(CParser.PostStaticAssignmentExpressionDirectDeclaratorContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterDeclaratorDirectDeclarator(CParser.DeclaratorDirectDeclaratorContext ctx) { }
@Override public void enterTypeQualifierListPointerDirectDeclarator(CParser.TypeQualifierListPointerDirectDeclaratorContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitDeclaratorDirectDeclarator(CParser.DeclaratorDirectDeclaratorContext ctx) { }
@Override public void exitTypeQualifierListPointerDirectDeclarator(CParser.TypeQualifierListPointerDirectDeclaratorContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterFunctionPointerDirectDeclarator(CParser.FunctionPointerDirectDeclaratorContext ctx) { }
@Override public void enterDeclaratorDirectDeclarator(CParser.DeclaratorDirectDeclaratorContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitFunctionPointerDirectDeclarator(CParser.FunctionPointerDirectDeclaratorContext ctx) { }
@Override public void exitDeclaratorDirectDeclarator(CParser.DeclaratorDirectDeclaratorContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterIdentifierListDirectDeclarator(CParser.IdentifierListDirectDeclaratorContext ctx) { }
@Override public void enterFunctionPointerDirectDeclarator(CParser.FunctionPointerDirectDeclaratorContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitIdentifierListDirectDeclarator(CParser.IdentifierListDirectDeclaratorContext ctx) { }
@Override public void exitFunctionPointerDirectDeclarator(CParser.FunctionPointerDirectDeclaratorContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterParammeterDirectDeclarator(CParser.ParammeterDirectDeclaratorContext ctx) { }
@Override public void enterIdentifierListDirectDeclarator(CParser.IdentifierListDirectDeclaratorContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitParammeterDirectDeclarator(CParser.ParammeterDirectDeclaratorContext ctx) { }
@Override public void exitIdentifierListDirectDeclarator(CParser.IdentifierListDirectDeclaratorContext ctx) { }
/**
* {@inheritDoc}
*
......
......@@ -374,42 +374,42 @@ public class CBaseVisitor<T> extends AbstractParseTreeVisitor<T> implements CVis
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitPostStaticAssignmentExpressionDirectDeclarator(CParser.PostStaticAssignmentExpressionDirectDeclaratorContext ctx) { return visitChildren(ctx); }
@Override public T visitParameterDirectDeclarator(CParser.ParameterDirectDeclaratorContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitTypeQualifierListPointerDirectDeclarator(CParser.TypeQualifierListPointerDirectDeclaratorContext ctx) { return visitChildren(ctx); }
@Override public T visitPostStaticAssignmentExpressionDirectDeclarator(CParser.PostStaticAssignmentExpressionDirectDeclaratorContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitDeclaratorDirectDeclarator(CParser.DeclaratorDirectDeclaratorContext ctx) { return visitChildren(ctx); }
@Override public T visitTypeQualifierListPointerDirectDeclarator(CParser.TypeQualifierListPointerDirectDeclaratorContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitFunctionPointerDirectDeclarator(CParser.FunctionPointerDirectDeclaratorContext ctx) { return visitChildren(ctx); }
@Override public T visitDeclaratorDirectDeclarator(CParser.DeclaratorDirectDeclaratorContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitIdentifierListDirectDeclarator(CParser.IdentifierListDirectDeclaratorContext ctx) { return visitChildren(ctx); }
@Override public T visitFunctionPointerDirectDeclarator(CParser.FunctionPointerDirectDeclaratorContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitParammeterDirectDeclarator(CParser.ParammeterDirectDeclaratorContext ctx) { return visitChildren(ctx); }
@Override public T visitIdentifierListDirectDeclarator(CParser.IdentifierListDirectDeclaratorContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
......
......@@ -523,6 +523,18 @@ public interface CListener extends ParseTreeListener {
* @param ctx the parse tree
*/
void exitPreStaticAssignmentExpressionDirectDeclarator(CParser.PreStaticAssignmentExpressionDirectDeclaratorContext ctx);
/**
* Enter a parse tree produced by the {@code parameterDirectDeclarator}
* labeled alternative in {@link CParser#directDeclarator}.
* @param ctx the parse tree
*/
void enterParameterDirectDeclarator(CParser.ParameterDirectDeclaratorContext ctx);
/**
* Exit a parse tree produced by the {@code parameterDirectDeclarator}
* labeled alternative in {@link CParser#directDeclarator}.
* @param ctx the parse tree
*/
void exitParameterDirectDeclarator(CParser.ParameterDirectDeclaratorContext ctx);
/**
* Enter a parse tree produced by the {@code postStaticAssignmentExpressionDirectDeclarator}
* labeled alternative in {@link CParser#directDeclarator}.
......@@ -583,18 +595,6 @@ public interface CListener extends ParseTreeListener {
* @param ctx the parse tree
*/
void exitIdentifierListDirectDeclarator(CParser.IdentifierListDirectDeclaratorContext ctx);
/**
* Enter a parse tree produced by the {@code parammeterDirectDeclarator}
* labeled alternative in {@link CParser#directDeclarator}.
* @param ctx the parse tree
*/
void enterParammeterDirectDeclarator(CParser.ParammeterDirectDeclaratorContext ctx);
/**
* Exit a parse tree produced by the {@code parammeterDirectDeclarator}
* labeled alternative in {@link CParser#directDeclarator}.
* @param ctx the parse tree
*/
void exitParammeterDirectDeclarator(CParser.ParammeterDirectDeclaratorContext ctx);
/**
* Enter a parse tree produced by the {@code identifierDirectDeclarator}
* labeled alternative in {@link CParser#directDeclarator}.
......
......@@ -4545,6 +4545,30 @@ public class CParser extends Parser {
else return visitor.visitChildren(this);
}
}
public static class ParameterDirectDeclaratorContext extends DirectDeclaratorContext {
public DirectDeclaratorContext directDeclarator() {
return getRuleContext(DirectDeclaratorContext.class,0);
}
public TerminalNode LeftParen() { return getToken(CParser.LeftParen, 0); }
public ParameterTypeListContext parameterTypeList() {
return getRuleContext(ParameterTypeListContext.class,0);
}
public TerminalNode RightParen() { return getToken(CParser.RightParen, 0); }
public ParameterDirectDeclaratorContext(DirectDeclaratorContext ctx) { copyFrom(ctx); }
@Override
public void enterRule(ParseTreeListener listener) {
if ( listener instanceof CListener ) ((CListener)listener).enterParameterDirectDeclarator(this);
}
@Override
public void exitRule(ParseTreeListener listener) {
if ( listener instanceof CListener ) ((CListener)listener).exitParameterDirectDeclarator(this);
}
@Override
public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
if ( visitor instanceof CVisitor ) return ((CVisitor<? extends T>)visitor).visitParameterDirectDeclarator(this);
else return visitor.visitChildren(this);
}
}
public static class PostStaticAssignmentExpressionDirectDeclaratorContext extends DirectDeclaratorContext {
public DirectDeclaratorContext directDeclarator() {
return getRuleContext(DirectDeclaratorContext.class,0);
......@@ -4670,30 +4694,6 @@ public class CParser extends Parser {
else return visitor.visitChildren(this);
}
}
public static class ParammeterDirectDeclaratorContext extends DirectDeclaratorContext {
public DirectDeclaratorContext directDeclarator() {
return getRuleContext(DirectDeclaratorContext.class,0);
}
public TerminalNode LeftParen() { return getToken(CParser.LeftParen, 0); }
public ParameterTypeListContext parameterTypeList() {
return getRuleContext(ParameterTypeListContext.class,0);
}
public TerminalNode RightParen() { return getToken(CParser.RightParen, 0); }
public ParammeterDirectDeclaratorContext(DirectDeclaratorContext ctx) { copyFrom(ctx); }
@Override
public void enterRule(ParseTreeListener listener) {
if ( listener instanceof CListener ) ((CListener)listener).enterParammeterDirectDeclarator(this);
}
@Override
public void exitRule(ParseTreeListener listener) {
if ( listener instanceof CListener ) ((CListener)listener).exitParammeterDirectDeclarator(this);
}
@Override
public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
if ( visitor instanceof CVisitor ) return ((CVisitor<? extends T>)visitor).visitParammeterDirectDeclarator(this);
else return visitor.visitChildren(this);
}
}
public static class IdentifierDirectDeclaratorContext extends DirectDeclaratorContext {
public TerminalNode Identifier() { return getToken(CParser.Identifier, 0); }
public IdentifierDirectDeclaratorContext(DirectDeclaratorContext ctx) { copyFrom(ctx); }
......@@ -4907,7 +4907,7 @@ public class CParser extends Parser {
break;
case 5:
{
_localctx = new ParammeterDirectDeclaratorContext(new DirectDeclaratorContext(_parentctx, _parentState));
_localctx = new ParameterDirectDeclaratorContext(new DirectDeclaratorContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_directDeclarator);
setState(782);
if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)");
......
......@@ -319,6 +319,13 @@ public interface CVisitor<T> extends ParseTreeVisitor<T> {
* @return the visitor result
*/
T visitPreStaticAssignmentExpressionDirectDeclarator(CParser.PreStaticAssignmentExpressionDirectDeclaratorContext ctx);
/**
* Visit a parse tree produced by the {@code parameterDirectDeclarator}
* labeled alternative in {@link CParser#directDeclarator}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitParameterDirectDeclarator(CParser.ParameterDirectDeclaratorContext ctx);
/**
* Visit a parse tree produced by the {@code postStaticAssignmentExpressionDirectDeclarator}
* labeled alternative in {@link CParser#directDeclarator}.
......@@ -354,13 +361,6 @@ public interface CVisitor<T> extends ParseTreeVisitor<T> {
* @return the visitor result
*/
T visitIdentifierListDirectDeclarator(CParser.IdentifierListDirectDeclaratorContext ctx);
/**
* Visit a parse tree produced by the {@code parammeterDirectDeclarator}
* labeled alternative in {@link CParser#directDeclarator}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitParammeterDirectDeclarator(CParser.ParammeterDirectDeclaratorContext ctx);
/**
* Visit a parse tree produced by the {@code identifierDirectDeclarator}
* labeled alternative in {@link CParser#directDeclarator}.
......
......@@ -57,9 +57,9 @@ open class CFullIdentListener(fileName: String) : CAstBaseListener() {
fun parseDirectDeclarator(ctx: CParser.DirectDeclaratorContext) {
val directDeclaratorType = ctx::class.java.simpleName
when(directDeclaratorType) {
"ParammeterDirectDeclaratorContext" -> {
"ParameterDirectDeclaratorContext" -> {
currentFunction.Parameters = arrayOf<CodeProperty>()
val directDeclarator = ctx as CParser.ParammeterDirectDeclaratorContext
val directDeclarator = ctx as CParser.ParameterDirectDeclaratorContext
parseDirectDeclarator(ctx.directDeclarator())
val parameterTypeList = directDeclarator.parameterTypeList().parameterList()
var parameters: MutableList<CParser.ParameterDeclarationContext> = ArrayList()
......@@ -108,12 +108,12 @@ open class CFullIdentListener(fileName: String) : CAstBaseListener() {
}
val directDeclaratorType = directDeclarator.directDeclarator()::class.java.simpleName
if(directDeclaratorType == "IdentifierDirectDeclaratorContext") {
name = (directDeclarator.directDeclarator() as CParser.IdentifierDirectDeclaratorContext).Identifier().text + '*'
name = (directDeclarator.directDeclarator() as CParser.IdentifierDirectDeclaratorContext).Identifier().text
}
if (name != null && type != null) {
currentFunction.Parameters += CodeProperty(
TypeValue = name,
TypeType = type
TypeType = "$type*"
)
}
}
......
......@@ -121,6 +121,40 @@ int is_old(Person* p) {
assertEquals(codeFile.DataStructures[0].Functions[0].Name, "is_old")
}
@Test
internal fun shouldIdentifyFunctionSingleParameter() {
val code = """
int is_old(Person* p) {
return p->age > 60;
}
"""
val codeFile = CAnalyser().analysis(code, "helloworld.c")
val parameters = codeFile.DataStructures[0].Functions[0].Parameters
assertEquals(parameters.size, 1)
assertEquals(parameters[0].TypeType, "Person*")
assertEquals(parameters[0].TypeValue, "p")
}
@Test
internal fun shouldIdentifyFunctionMultiParameters() {
val code = """
int is_old(Person* p, int a, double b) {
return p->age > 60;
}
"""
val codeFile = CAnalyser().analysis(code, "helloworld.c")
val parameters = codeFile.DataStructures[0].Functions[0].Parameters
assertEquals(parameters.size, 3)
assertEquals(parameters[0].TypeType, "Person*")
assertEquals(parameters[0].TypeValue, "p")
assertEquals(parameters[1].TypeType, "int")
assertEquals(parameters[1].TypeValue, "a")
assertEquals(parameters[2].TypeType, "double")
assertEquals(parameters[2].TypeValue, "b")
}
@Test
internal fun shouldIdentifyForwardDeclaration() {
val code = """
......
......@@ -333,7 +333,7 @@ directDeclarator
| directDeclarator '[' 'static' typeQualifierList? assignmentExpression ']' #preStaticAssignmentExpressionDirectDeclarator
| directDeclarator '[' typeQualifierList 'static' assignmentExpression ']' #postStaticAssignmentExpressionDirectDeclarator
| directDeclarator '[' typeQualifierList? '*' ']' #typeQualifierListPointerDirectDeclarator
| directDeclarator '(' parameterTypeList ')' #parammeterDirectDeclarator
| directDeclarator '(' parameterTypeList ')' #parameterDirectDeclarator
| directDeclarator '(' identifierList? ')' #identifierListDirectDeclarator
| Identifier ':' DigitSequence #bitFieldDirectDeclarator // bit field
| '(' typeSpecifier? pointer directDeclarator ')' #functionPointerDirectDeclarator // function pointer like: (__cdecl *f)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册