diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index ba6f66cd..70c1c140 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -15588,11 +15588,12 @@ void BfExprEvaluator::CheckObjectCreateTypeRef(BfType* expectingType, BfAstNode* auto arrayType = (BfArrayType*)expectingType; expectingType = arrayType->mGenericTypeInfo->mTypeGenericArguments[0]; } - + auto expectingTypeInst = expectingType->ToTypeInstance(); if (expectingTypeInst != NULL) { - autoComplete->AddTypeInstanceEntry(expectingTypeInst); + if (!expectingTypeInst->IsAnonymous()) + autoComplete->AddTypeInstanceEntry(expectingTypeInst); } else autoComplete->mDefaultSelection = mModule->TypeToString(expectingType); diff --git a/IDEHelper/Compiler/BfReducer.cpp b/IDEHelper/Compiler/BfReducer.cpp index 5fb973a8..8be26ed0 100644 --- a/IDEHelper/Compiler/BfReducer.cpp +++ b/IDEHelper/Compiler/BfReducer.cpp @@ -8230,13 +8230,24 @@ BfScopedInvocationTarget* BfReducer::CreateScopedInvocationTarget(BfAstNode*& ta void BfReducer::InitAnonymousType(BfTypeDeclaration* typeDecl) { auto block = BfNodeDynCast(typeDecl->mDefineNode); + int blockId = 0; + if (blockId != NULL) + { + blockId = block->mParserBlockId; + } + else + { + auto parser = mSource->ToParser(); + if (parser != NULL) + blockId = parser->mCurBlockId + typeDecl->mSrcStart; + } String name; auto parserData = typeDecl->GetParserData(); name = "_Anon_"; auto parseFileData = parserData->mParseFileData; - int uniqueId = parseFileData->GetUniqueId(block->mParserBlockId); + int uniqueId = parseFileData->GetUniqueId(blockId); name += StrFormat("%d", uniqueId); int len = (int)name.length() + 1; @@ -9464,12 +9475,20 @@ BfAstNode* BfReducer::CreateTopLevelObject(BfTokenNode* tokenNode, BfAttributeDi if (baseTypeIdx > 0) { + bool hasComma = false; + if (auto tokenNode = BfNodeDynCast(nextNode)) { - if (tokenNode->mToken == BfToken_Semicolon) - { - break; - } + if ((tokenNode->mToken == BfToken_Semicolon) && (!isAnonymous)) + break; + if (tokenNode->mToken == BfToken_Comma) + hasComma = true; + } + + if ((!hasComma) && (isAnonymous)) + { + // End type declaration + break; } BfTokenNode* commaToken = NULL; @@ -9551,7 +9570,7 @@ BfAstNode* BfReducer::CreateTopLevelObject(BfTokenNode* tokenNode, BfAttributeDi if (tokenNode != NULL) { - if (tokenNode->GetToken() == BfToken_Semicolon) + if ((tokenNode->GetToken() == BfToken_Semicolon) && (!isAnonymous)) { typeDeclaration->mDefineNode = tokenNode; MoveNode(tokenNode, typeDeclaration); @@ -9560,6 +9579,9 @@ BfAstNode* BfReducer::CreateTopLevelObject(BfTokenNode* tokenNode, BfAttributeDi } } + if ((isAnonymous) && (!BfNodeIsA(nextNode))) + return typeDeclaration; + auto blockNode = ExpectBlockAfter(typeDeclaration); if (blockNode != NULL) { diff --git a/IDEHelper/Tests/src/Anonymous.bf b/IDEHelper/Tests/src/Anonymous.bf index 4f74dcd7..588c1008 100644 --- a/IDEHelper/Tests/src/Anonymous.bf +++ b/IDEHelper/Tests/src/Anonymous.bf @@ -45,6 +45,8 @@ class Anonymous public int Val = 123; } + public static class : this(int x, int y) sValA = new .(3, 4) ~ delete _; + [Test] public static void TestBasics() { @@ -85,5 +87,8 @@ class Anonymous var str = ca.ToString(.. scope .()); Test.Assert(str == "ClassA override"); + + Test.Assert(sValA.x == 3); + Test.Assert(sValA.y == 4); } } \ No newline at end of file