Umwandlung von Methodenaufrufen implementiert

This commit is contained in:
luca9913 2023-02-26 21:04:51 +01:00
parent aa5f79257e
commit c118c05bb2
2 changed files with 89 additions and 83 deletions

View File

@ -538,7 +538,7 @@ statement
| YIELD expression ';' #yieldstmt // Java17
| SEMI #semistmt
| statementExpression=expression ';' #stmtexpression
| switchExpression ';'? #switchexpression // Java17
| switchExpression ';'? #switchexpressionstmt // Java17
| identifierLabel=identifier ':' statement #labeledstmt
;
@ -625,8 +625,7 @@ expression
| NEW creator #newinstanceexpression
| '(' annotation* typeType ('&' typeType)* ')' expression #castexpression
| expression postfix=('++' | '--') #postfixexpression
| prefix=('+'|'-'|'++'|'--') expression #prefixincdecexpression
| prefix=('~'|'!') expression #prefixnegateexpression
| prefix=('+'|'-'|'++'|'--'|'~'|'!') expression #prefixexpression
| expression bop=('*'|'/'|'%') expression #mathmuldivmodexpression
| expression bop=('+'|'-') expression #mathaddsubexpression
| expression ('<' '<' | '>' '>' '>' | '>' '>') expression #shifexpression
@ -646,9 +645,9 @@ expression
| switchExpression #switchexpression // Java17
// Java 8 methodReference
| expression '::' typeArguments? identifier
| typeType '::' (typeArguments? identifier | NEW)
| classType '::' typeArguments? NEW
| expression '::' typeArguments? identifier #methodreferenceexpression
| typeType '::' (typeArguments? identifier | NEW) #methodorcreatorreferenceexpression
| classType '::' typeArguments? NEW #creatorreferenceexpression
;
// Java17

View File

@ -4,18 +4,26 @@ import de.dhbwstuttgart.exceptions.NotImplementedException;
import de.dhbwstuttgart.parser.NullToken;
import de.dhbwstuttgart.parser.antlr.Java17Parser;
import de.dhbwstuttgart.parser.antlr.Java17Parser.AssertstmtContext;
import de.dhbwstuttgart.parser.antlr.Java17Parser.AssignexpressionContext;
import de.dhbwstuttgart.parser.antlr.Java17Parser.BlockstmtContext;
import de.dhbwstuttgart.parser.antlr.Java17Parser.BreakstmtContext;
import de.dhbwstuttgart.parser.antlr.Java17Parser.ConditionalstmtContext;
import de.dhbwstuttgart.parser.antlr.Java17Parser.ContinuestmtContext;
import de.dhbwstuttgart.parser.antlr.Java17Parser.DottedexpressionContext;
import de.dhbwstuttgart.parser.antlr.Java17Parser.ForControlContext;
import de.dhbwstuttgart.parser.antlr.Java17Parser.ForloopContext;
import de.dhbwstuttgart.parser.antlr.Java17Parser.LabeledstmtContext;
import de.dhbwstuttgart.parser.antlr.Java17Parser.MethodcallexpressionContext;
import de.dhbwstuttgart.parser.antlr.Java17Parser.MethodCallContext;
import de.dhbwstuttgart.parser.antlr.Java17Parser.NewinstanceexpressionContext;
import de.dhbwstuttgart.parser.antlr.Java17Parser.PostfixexpressionContext;
import de.dhbwstuttgart.parser.antlr.Java17Parser.PrefixexpressionContext;
import de.dhbwstuttgart.parser.antlr.Java17Parser.PrimaryexpressionContext;
import de.dhbwstuttgart.parser.antlr.Java17Parser.ReturnstmtContext;
import de.dhbwstuttgart.parser.antlr.Java17Parser.SemistmtContext;
import de.dhbwstuttgart.parser.antlr.Java17Parser.StmtexpressionContext;
import de.dhbwstuttgart.parser.antlr.Java17Parser.SwitchexpressionContext;
import de.dhbwstuttgart.parser.antlr.Java17Parser.SwitchexpressionstmtContext;
import de.dhbwstuttgart.parser.antlr.Java17Parser.SwitchstmtContext;
import de.dhbwstuttgart.parser.antlr.Java17Parser.SynchronizedstmtContext;
import de.dhbwstuttgart.parser.antlr.Java17Parser.ThrowstmtContext;
@ -105,7 +113,7 @@ public class StatementGenerator {
return convert(dowhileloop);
case SwitchstmtContext switchstmt:
return convert(switchstmt);
case SwitchexpressionContext switchexpression:
case SwitchexpressionstmtContext switchexpression:
return convert(switchexpression);
case ReturnstmtContext returnstmt:
return convert(returnstmt);
@ -159,32 +167,27 @@ public class StatementGenerator {
private Statement convert(Java17Parser.StmtexpressionContext stmt) {
ExpressionContext expr = stmt.statementExpression;
Token offset = stmt.getStart();
String op = expr.bop.getText();
if(!Objects.isNull(expr.methodCall())){
return convertMethodCall(expr, offset);
}else if(!Objects.isNull(expr.innerCreator())){
switch (expr) {
case DottedexpressionContext dotted:
return convertDottedExpression(dotted, offset);
case MethodcallexpressionContext methodc:
return convertMethodCall(methodc.methodCall(), offset);
case NewinstanceexpressionContext newinstance:
}else if()
else if (!op.isEmpty()) {
return convertAssignment(expr, op);
}
if (!(op = expr.prefix.getText()).isEmpty()) {
return convertPrefixStatementExpression(expr, offset);
} else if (!(op = expr.postfix.getText()).isEmpty()) {
return convertPostfixStatementExpression(expr, offset);
} else if (!(Objects.isNull(expr.methodCall()))) {
return convertMethodCall(expr, offset);
} else
throw new NotImplementedException();
if (stmt.classInstanceCreationExpression() != null) {
return convert(stmt.classInstanceCreationExpression());
break;
case AssignexpressionContext assignment:
return convertAssignment(assignment);
case PostfixexpressionContext postfix:
return convertPostfixStatementExpression(postfix.expression(), postfix.postfix.getText(), offset);
case PrefixexpressionContext prefix:
return convertPrefixStatementExpression(prefix.expression(), prefix.prefix.getText(), offset);
default:
throw new NotImplementedException();
}
}
private Statement convertAssignment(ExpressionContext expr, String operator) {
switch (operator) {
private Statement convertAssignment(AssignexpressionContext expr) {
switch (expr.bop.getText()) {
case "=":
ExpressionContext leftside = expr.expression(0);
AssignLeftSide leftHandSide = convert(leftside.getText(), leftside.getStart());
@ -207,8 +210,7 @@ public class StatementGenerator {
}
}
private Statement convertPrefixStatementExpression(ExpressionContext expr, Token offset) {
String op = expr.bop.getText();
private Statement convertPrefixStatementExpression(ExpressionContext expr, String op, Token offset) {
Expression argument = convert(expr);
Statement ret;
if (op.equals("++")) {
@ -224,8 +226,7 @@ public class StatementGenerator {
}
}
private Statement convertPostfixStatementExpression(ExpressionContext expr, Token offset) {
String op = expr.bop.getText();
private Statement convertPostfixStatementExpression(ExpressionContext expr, String op, Token offset) {
Expression argument = convert(expr);
Statement ret;
if (op.equals("++")) {
@ -241,48 +242,69 @@ public class StatementGenerator {
}
}
private Statement convertMethodCall(ExpressionContext expr, Token offset) {
MethodCallContext methodc = expr.methodCall();
String name;
Expression receiver;
if (methodc.identifier() != null) {
name = methodc.identifier().getText();
receiver = null;
} else if (!Objects.isNull(methodc.SUPER())) {
private Statement convertDottedExpression(DottedexpressionContext expr, Token offset) {
if (!Objects.isNull(expr.methodCall())) {
return convertMethodCall(expr.methodCall(), expr.expression(), offset);
} else if (!Objects.isNull(expr.NEW())) {
return null;
} else {
throw new NotImplementedException();
}
}
private MethodCall convertMethodCall(MethodCallContext expr, Token offset) {
String name = "this";
Expression receiver = new This(offset);
if (expr.identifier() != null) {
name = expr.identifier().getText();
} else if (!Objects.isNull(expr.SUPER())) {
// if(methodInvocationContext.Identifier() != null){
name = methodc.SUPER().getText();
name = expr.SUPER().getText();
receiver = new Super(offset);
} else if (!Objects.isNull(methodc.THIS())) {
name = methodc.THIS().getText();
receiver = new This(offset);
}
if (methodInvocationContext.typeName() != null) {
receiver = generateLocalOrFieldVarOrClassName(methodInvocationContext.typeName().getText(),
methodInvocationContext.typeName().getStart());
} else if (methodInvocationContext.expressionName() != null) {
receiver = convert(methodInvocationContext.expressionName());
} else if (methodInvocationContext.primary() != null) {
receiver = convert(methodInvocationContext.primary());
} else if (methodInvocationContext.toString().startsWith("super")) {
receiver = new Super(methodInvocationContext.getStart());
} else if (methodInvocationContext.methodName() != null) {
receiver = new This(methodInvocationContext.getStart());
} else
throw new NotImplementedException();
ArgumentList argumentList = convertArguments(methodc.expressionList());
ArgumentList argumentList = convertArguments(expr.expressionList());
ArrayList<RefTypeOrTPHOrWildcardOrGeneric> argTypes = argumentList.getArguments().stream()
.map(x -> (RefTypeOrTPHOrWildcardOrGeneric) TypePlaceholder.fresh(offset))
.collect(Collectors.toCollection(ArrayList::new));
MethodCall ret = new MethodCall(TypePlaceholder.fresh(offset),
getReceiver(receiver), name, argumentList, TypePlaceholder.fresh(methodInvocationContext.getStart()),
argTypes, methodInvocationContext.getStart());
getReceiver(receiver), name, argumentList, TypePlaceholder.fresh(offset),
argTypes, offset);
ret.setStatement();
return ret;
}
private MethodCall convertMethodCall(MethodCallContext expr, ExpressionContext receiver, Token offset) {
String name = "this";
if (expr.identifier() != null) {
name = expr.identifier().getText();
} else if (!Objects.isNull(expr.SUPER())) {
// if(methodInvocationContext.Identifier() != null){
name = expr.SUPER().getText();
}
ArgumentList argumentList = convertArguments(expr.expressionList());
ArrayList<RefTypeOrTPHOrWildcardOrGeneric> argTypes = argumentList.getArguments().stream()
.map(x -> (RefTypeOrTPHOrWildcardOrGeneric) TypePlaceholder.fresh(offset))
.collect(Collectors.toCollection(ArrayList::new));
MethodCall ret = new MethodCall(TypePlaceholder.fresh(offset),
getReceiver(receiver), name, argumentList, TypePlaceholder.fresh(offset),
argTypes, offset);
ret.setStatement();
return ret;
}
public Receiver getReceiver(ExpressionContext expr) {
Expression expression;
if (expr instanceof PrimaryexpressionContext pc) {
expression = convert(pc.primary());
} else {
expression = generateLocalOrFieldVarOrClassName(expr.getText(), expr.getStart());
}
return getReceiver(expression);
}
public Receiver getReceiver(Expression expr) {
if (expr instanceof StaticClassName) {
return (Receiver) expr;
@ -291,21 +313,6 @@ public class StatementGenerator {
}
}
private ArgumentList convert(Java17Parser.ArgumentListContext argumentListContext) {
if (argumentListContext == null)
return new ArgumentList(new ArrayList<>(), new NullToken());
List<Expression> args = new ArrayList<>();
Token offset = new NullToken();
for (Java17Parser.ExpressionContext expr : argumentListContext.expression()) {
args.add(convert(expr));
}
if (args.size() > 0)
offset = args.get(0).getOffset();
return new ArgumentList(args, offset);
}
/**
* Der Parser kann nicht zwischen einer lokalen Variable, einem Feldzugriff und
* einer Klassenangabe unterscheiden.
@ -359,11 +366,7 @@ public class StatementGenerator {
return new FieldVar(receiver, parts[parts.length - 1], TypePlaceholder.fresh(offset), offset);
}
private Expression convert(Java17Parser.ExpressionNameContext expressionNameContext) {
return generateLocalOrFieldVarOrClassName(expressionNameContext.getText(), expressionNameContext.getStart());
}
private Statement convert(Java17Parser.ClassInstanceCreationExpressionContext newExpression) {
private Statement convert(Java17Parser.NewinstanceexpressionContext newExpression) {
Java17Parser.TypeArgumentsContext genericArgs = null;
if (newExpression.expressionName() != null)
throw new NotImplementedException();
@ -464,11 +467,15 @@ public class StatementGenerator {
}
private ArgumentList convertArguments(Java17Parser.ExpressionListContext arglist) {
Token offset = arglist.getStart();
if (arglist == null)
return new ArgumentList(new ArrayList<>(), new NullToken());
Token offset = new NullToken();
List<Expression> arguments = new ArrayList<Expression>();
for (ExpressionContext arg : arglist.expression()) {
arguments.add(convert(arg));
}
if (arguments.size() > 0)
offset = arguments.get(0).getOffset();
return new ArgumentList(arguments, offset);
}