Add 'ParseReturnValuesOnly' to the lua prototype parser.
This commit is contained in:
@@ -91,10 +91,7 @@ void FlxParsedProto::Syntax() {
|
||||
ErrorMessage = Message;
|
||||
}
|
||||
|
||||
void FlxParsedProto::Parse(const FString &str) {
|
||||
Empty();
|
||||
|
||||
// Step one: tokenize.
|
||||
bool FlxParsedProto::Tokenize(const FString &str) {
|
||||
int offset = 0;
|
||||
while (offset < str.Len()) {
|
||||
TCHAR c = str[offset];
|
||||
@@ -113,12 +110,33 @@ void FlxParsedProto::Parse(const FString &str) {
|
||||
} else {
|
||||
Empty();
|
||||
ErrorMessage = FString::Printf(TEXT("%s ? %s"), *str.Mid(0, offset), *str.Mid(offset));
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
NextToken = 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
// Step two: Parse.
|
||||
void FlxParsedProto::ParseReturnValues() {
|
||||
while (true) {
|
||||
if (IsLiteral(TEXT("..."))) {
|
||||
ExtraReturnValues = true;
|
||||
NextToken++;
|
||||
break;
|
||||
} else if (IsIdent()) {
|
||||
FString Type = Tokens[NextToken++];
|
||||
if (!IsIdent()) return Syntax();
|
||||
FString Name = Tokens[NextToken++];
|
||||
ReturnValues.Add(Pin(Type, Name));
|
||||
if (!IsLiteral(TEXT(","))) break;
|
||||
NextToken++;
|
||||
} else {
|
||||
return Syntax();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void FlxParsedProto::Parse() {
|
||||
if (!IsLiteral(TEXT("*")) && !IsIdent()) return Syntax();
|
||||
ClassName = Tokens[NextToken++];
|
||||
if (!IsLiteral(TEXT("."))) return Syntax();
|
||||
@@ -142,24 +160,24 @@ void FlxParsedProto::Parse(const FString &str) {
|
||||
NextToken++;
|
||||
if (IsLiteral(TEXT(":"))) {
|
||||
NextToken++;
|
||||
while (true) {
|
||||
if (IsLiteral(TEXT("..."))) {
|
||||
ExtraReturnValues = true;
|
||||
NextToken++;
|
||||
break;
|
||||
} else if (IsIdent()) {
|
||||
FString Type = Tokens[NextToken++];
|
||||
if (!IsIdent()) return Syntax();
|
||||
FString Name = Tokens[NextToken++];
|
||||
ReturnValues.Add(Pin(Type, Name));
|
||||
if (!IsLiteral(TEXT(","))) break;
|
||||
NextToken++;
|
||||
} else {
|
||||
return Syntax();
|
||||
}
|
||||
}
|
||||
ParseReturnValues();
|
||||
}
|
||||
if (NextToken != Tokens.Num()) return Syntax();
|
||||
}
|
||||
|
||||
FlxParsedProto FlxParsedProto::ParsePrototype(const FString &str) {
|
||||
FlxParsedProto Result;
|
||||
if (!Result.Tokenize(str)) return Result;
|
||||
Result.Parse();
|
||||
if (Result.NextToken != Result.Tokens.Num()) Result.Syntax();
|
||||
return Result;
|
||||
}
|
||||
|
||||
FlxParsedProto FlxParsedProto::ParseReturnValuesOnly(const FString &str) {
|
||||
FlxParsedProto Result;
|
||||
if (!Result.Tokenize(str)) return Result;
|
||||
Result.ParseReturnValues();
|
||||
if (Result.NextToken != Result.Tokens.Num()) Result.Syntax();
|
||||
return Result;
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////
|
||||
|
||||
Reference in New Issue
Block a user