Lines Matching refs:ir

31 #include "ir/astNode.h"
32 #include "ir/base/classDefinition.h"
33 #include "ir/base/decorator.h"
34 #include "ir/base/catchClause.h"
35 #include "ir/base/classProperty.h"
36 #include "ir/base/scriptFunction.h"
37 #include "ir/base/methodDefinition.h"
38 #include "ir/base/classStaticBlock.h"
39 #include "ir/base/spreadElement.h"
40 #include "ir/expressions/identifier.h"
41 #include "ir/expressions/functionExpression.h"
42 #include "ir/expressions/dummyNode.h"
43 #include "ir/module/importDeclaration.h"
44 #include "ir/module/importDefaultSpecifier.h"
45 #include "ir/module/importSpecifier.h"
46 #include "ir/module/exportSpecifier.h"
47 #include "ir/module/exportNamedDeclaration.h"
48 #include "ir/statements/assertStatement.h"
49 #include "ir/statements/blockStatement.h"
50 #include "ir/statements/ifStatement.h"
51 #include "ir/statements/labelledStatement.h"
52 #include "ir/statements/namespaceDeclaration.h"
53 #include "ir/statements/switchStatement.h"
54 #include "ir/statements/throwStatement.h"
55 #include "ir/statements/tryStatement.h"
56 #include "ir/statements/whileStatement.h"
57 #include "ir/statements/forOfStatement.h"
58 #include "ir/statements/doWhileStatement.h"
59 #include "ir/statements/breakStatement.h"
60 #include "ir/statements/debuggerStatement.h"
61 #include "ir/ets/etsLaunchExpression.h"
62 #include "ir/ets/etsClassLiteral.h"
63 #include "ir/ets/etsPrimitiveType.h"
64 #include "ir/ets/etsPackageDeclaration.h"
65 #include "ir/ets/etsReExportDeclaration.h"
66 #include "ir/ets/etsWildcardType.h"
67 #include "ir/ets/etsNewArrayInstanceExpression.h"
68 #include "ir/ets/etsTuple.h"
69 #include "ir/ets/etsFunctionType.h"
70 #include "ir/ets/etsNewClassInstanceExpression.h"
71 #include "ir/ets/etsNewMultiDimArrayInstanceExpression.h"
72 #include "ir/ets/etsScript.h"
73 #include "ir/ets/etsTypeReference.h"
74 #include "ir/ets/etsTypeReferencePart.h"
75 #include "ir/ets/etsNullishTypes.h"
76 #include "ir/ets/etsUnionType.h"
77 #include "ir/ets/etsImportSource.h"
78 #include "ir/ets/etsImportDeclaration.h"
79 #include "ir/ets/etsStructDeclaration.h"
80 #include "ir/ets/etsParameterExpression.h"
81 #include "ir/module/importNamespaceSpecifier.h"
82 #include "ir/ts/tsAsExpression.h"
83 #include "ir/ts/tsInterfaceDeclaration.h"
84 #include "ir/ts/tsEnumDeclaration.h"
85 #include "ir/ts/tsTypeParameterInstantiation.h"
86 #include "ir/ts/tsInterfaceBody.h"
87 #include "ir/ts/tsImportEqualsDeclaration.h"
88 #include "ir/ts/tsArrayType.h"
89 #include "ir/ts/tsQualifiedName.h"
90 #include "ir/ts/tsTypeReference.h"
91 #include "ir/ts/tsTypeParameter.h"
92 #include "ir/ts/tsInterfaceHeritage.h"
93 #include "ir/ts/tsFunctionType.h"
94 #include "ir/ts/tsClassImplements.h"
95 #include "ir/ts/tsEnumMember.h"
96 #include "ir/ts/tsTypeAliasDeclaration.h"
97 #include "ir/ts/tsTypeParameterDeclaration.h"
98 #include "ir/ts/tsNonNullExpression.h"
99 #include "ir/ts/tsThisType.h"
113 ir::ModifierFlags ETSParser::ParseClassModifiers()
115 ir::ModifierFlags flags = ir::ModifierFlags::NONE;
118 ir::ModifierFlags currentFlag = ir::ModifierFlags::NONE;
127 currentFlag = ir::ModifierFlags::STATIC;
131 currentFlag = ir::ModifierFlags::FINAL;
135 currentFlag = ir::ModifierFlags::ABSTRACT;
154 std::tuple<ir::Expression *, ir::TSTypeParameterInstantiation *> ETSParser::ParseClassImplementsElement()
162 ir::Expression *ETSParser::ParseSuperClassReference()
176 ir::TypeNode *ETSParser::ParseInterfaceExtendsElement()
190 std::tuple<ir::ModifierFlags, bool> ETSParser::ParseClassMemberAccessModifiers()
193 return {ir::ModifierFlags::PUBLIC, false};
199 return {ir::ModifierFlags::NONE, false};
207 ir::ModifierFlags accessFlag = ir::ModifierFlags::NONE;
211 accessFlag = ir::ModifierFlags::PUBLIC;
215 accessFlag = ir::ModifierFlags::PRIVATE;
219 accessFlag = ir::ModifierFlags::PROTECTED;
225 accessFlag = ir::ModifierFlags::INTERNAL;
228 accessFlag = ir::ModifierFlags::INTERNAL_PROTECTED;
236 (accessFlag == ir::ModifierFlags::PUBLIC || accessFlag == ir::ModifierFlags::PRIVATE ||
237 accessFlag == ir::ModifierFlags::PROTECTED)) {
250 ir::ModifierFlags ETSParser::ParseClassFieldModifiers(bool seenStatic)
252 ir::ModifierFlags flags = seenStatic ? ir::ModifierFlags::STATIC : ir::ModifierFlags::NONE;
260 ir::ModifierFlags currentFlag;
269 currentFlag = ir::ModifierFlags::STATIC;
273 currentFlag = ir::ModifierFlags::READONLY;
311 // Helper method for ir::ModifierFlags ETSParser::ParseClassMethodModifiers(bool seenStatic)
312 ir::ModifierFlags ETSParser::ParseClassMethodModifierFlag()
314 ir::ModifierFlags currentFlag = ir::ModifierFlags::NONE;
318 currentFlag = ir::ModifierFlags::STATIC;
322 currentFlag = ir::ModifierFlags::FINAL;
326 currentFlag = ir::ModifierFlags::NATIVE;
330 currentFlag = ir::ModifierFlags::ASYNC;
334 currentFlag = ir::ModifierFlags::OVERRIDE;
338 currentFlag = ir::ModifierFlags::ABSTRACT;
342 currentFlag = ir::ModifierFlags::DECLARE;
353 ir::ModifierFlags ETSParser::ParseClassMethodModifiers(bool seenStatic)
355 ir::ModifierFlags flags = seenStatic ? ir::ModifierFlags::STATIC : ir::ModifierFlags::NONE;
363 ir::ModifierFlags currentFlag = ir::ModifierFlags::NONE;
377 if ((flags & ir::ModifierFlags::ASYNC) != 0) {
378 if ((flags & ir::ModifierFlags::NATIVE) != 0) {
380 } else if ((flags & ir::ModifierFlags::ABSTRACT) != 0) {
390 void ETSParser::ParseClassFieldDefinition(ir::Identifier *fieldName, ir::ModifierFlags modifiers,
391 ArenaVector<ir::AstNode *> *declarations)
394 ir::TypeNode *typeAnnotation = nullptr;
408 ir::Expression *initializer = nullptr;
416 bool isDeclare = (modifiers & ir::ModifierFlags::DECLARE) != 0;
422 auto *field = AllocNode<ir::ClassProperty>(fieldName, initializer, typeAnnotation, modifiers, Allocator(), false);
425 field->AddModifier(ir::ModifierFlags::OPTIONAL);
432 ir::Identifier *nextName = ExpectIdentifier(false, true);
437 ir::MethodDefinition *ETSParser::ParseClassMethodDefinition(ir::Identifier *methodName, ir::ModifierFlags modifiers,
438 ir::Identifier *className)
441 auto methodKind = ir::MethodDefinitionKind::METHOD;
444 methodKind = ir::MethodDefinitionKind::EXTENSION_METHOD;
448 if ((modifiers & ir::ModifierFlags::CONSTRUCTOR) != 0) {
450 methodKind = ir::MethodDefinitionKind::CONSTRUCTOR;
453 if ((modifiers & ir::ModifierFlags::ASYNC) != 0) {
457 if ((modifiers & ir::ModifierFlags::STATIC) == 0) {
461 ir::ScriptFunction *func = ParseFunction(newStatus, className);
463 auto *funcExpr = AllocNode<ir::FunctionExpression>(func);
468 func->AddFlag(ir::ScriptFunctionFlags::INSTANCE_EXTENSION_METHOD);
470 auto *method = AllocNode<ir::MethodDefinition>(methodKind, methodName->Clone(Allocator(), nullptr)->AsExpression(),
477 ir::MethodDefinition *ETSParser::ParseClassMethod(ClassElementDescriptor *desc,
478 const ArenaVector<ir::AstNode *> &properties,
479 ir::Expression *propName, lexer::SourcePosition *propEnd)
481 if (desc->methodKind != ir::MethodDefinitionKind::SET &&
486 ir::ScriptFunction *func = ParseFunction(desc->newStatus);
492 auto *funcExpr = AllocNode<ir::FunctionExpression>(func);
495 if (desc->methodKind == ir::MethodDefinitionKind::SET) {
497 } else if (desc->methodKind == ir::MethodDefinitionKind::GET) {
502 func->AddFlag(ir::ScriptFunctionFlags::METHOD);
504 AllocNode<ir::MethodDefinition>(desc->methodKind, propName->Clone(Allocator(), nullptr)->AsExpression(),
523 ir::AstNode *ETSParser::ParseClassElement(const ArenaVector<ir::AstNode *> &properties,
524 ir::ClassDefinitionModifiers modifiers,
525 [[maybe_unused]] ir::ModifierFlags flags)
528 ir::ModifierFlags memberModifiers = ir::ModifierFlags::NONE;
532 memberModifiers |= ir::ModifierFlags::EXPORTED;
545 memberModifiers |= ir::ModifierFlags::DECLARE;
550 memberModifiers |= ir::ModifierFlags::STATIC;
582 ir::MethodDefinition *ETSParser::ParseClassGetterSetterMethod(const ArenaVector<ir::AstNode *> &properties,
583 const ir::ClassDefinitionModifiers modifiers,
584 const ir::ModifierFlags memberModifiers)
587 desc.methodKind = Lexer()->GetToken().KeywordType() == lexer::TokenType::KEYW_GET ? ir::MethodDefinitionKind::GET
588 : ir::MethodDefinitionKind::SET;
590 auto *methodName = AllocNode<ir::Identifier>(Lexer()->GetToken().Ident(), Allocator());
591 if (desc.methodKind == ir::MethodDefinitionKind::GET) {
600 desc.hasSuperClass = (modifiers & ir::ClassDefinitionModifiers::HAS_SUPER) != 0U;
605 ir::MethodDefinition *method = ParseClassMethod(&desc, properties, methodName, &propEnd);
608 if (desc.methodKind == ir::MethodDefinitionKind::GET) {
609 method->Function()->AddFlag(ir::ScriptFunctionFlags::GETTER);
611 method->Function()->AddFlag(ir::ScriptFunctionFlags::SETTER);
617 ir::MethodDefinition *ETSParser::ParseInterfaceGetterSetterMethod(const ir::ModifierFlags modifiers)
619 auto methodKind = Lexer()->GetToken().KeywordType() == lexer::TokenType::KEYW_GET ? ir::MethodDefinitionKind::GET
620 : ir::MethodDefinitionKind::SET;
623 ir::MethodDefinition *method = ParseInterfaceMethod(modifiers, methodKind);
624 method->AddModifier(ir::ModifierFlags::PUBLIC);
626 if (methodKind == ir::MethodDefinitionKind::GET) {
628 method->Function()->AddFlag(ir::ScriptFunctionFlags::GETTER);
631 method->Function()->AddFlag(ir::ScriptFunctionFlags::SETTER);
633 method->AddModifier(ir::ModifierFlags::PUBLIC);
641 ir::TSInterfaceDeclaration *ETSParser::ParseInterfaceBody(ir::Identifier *name, bool isStatic)
645 ir::TSTypeParameterDeclaration *typeParamDecl = nullptr;
652 ArenaVector<ir::TSInterfaceHeritage *> extends(Allocator()->Adapter());
661 if (member->Type() == ir::AstNodeType::CLASS_DECLARATION ||
662 member->Type() == ir::AstNodeType::STRUCT_DECLARATION ||
663 member->Type() == ir::AstNodeType::TS_ENUM_DECLARATION ||
664 member->Type() == ir::AstNodeType::TS_INTERFACE_DECLARATION) {
670 auto *body = AllocNode<ir::TSInterfaceBody>(std::move(members));
674 auto *interfaceDecl = AllocNode<ir::TSInterfaceDeclaration>(
676 ir::TSInterfaceDeclaration::ConstructorData {name, typeParamDecl, body, isStatic, isExternal,
685 ir::Statement *ETSParser::ParseInterfaceDeclaration(bool isStatic)
699 ir::ClassDefinition *ETSParser::ParseClassDefinition(ir::ClassDefinitionModifiers modifiers, ir::ModifierFlags flags)
703 ir::Identifier *identNode = ParseClassIdent(modifiers);
708 ir::TSTypeParameterDeclaration *typeParamDecl = nullptr;
719 modifiers |= ir::ClassDefinitionModifiers::HAS_SUPER;
724 flags |= ir::ModifierFlags::DECLARE;
728 ArenaVector<ir::TSClassImplements *> implements(Allocator()->Adapter());
734 ArenaVector<ir::AstNode *> properties(Allocator()->Adapter());
735 ir::MethodDefinition *ctor = nullptr;
738 if ((flags & ir::ModifierFlags::DECLARE) != 0U &&
749 auto *classDefinition = AllocNode<ir::ClassDefinition>(
767 ir::ModifierFlags ETSParser::ParseInterfaceMethodModifiers()
769 ir::ModifierFlags flags = ir::ModifierFlags::NONE;
772 ir::ModifierFlags currentFlag = ir::ModifierFlags::NONE;
787 currentFlag = ir::ModifierFlags::STATIC;
791 currentFlag = ir::ModifierFlags::PRIVATE;
816 ir::ClassProperty *ETSParser::ParseInterfaceField()
819 auto *name = AllocNode<ir::Identifier>(Lexer()->GetToken().Ident(), Allocator());
829 ir::TypeNode *typeAnnotation = nullptr;
846 ir::ModifierFlags fieldModifiers = ir::ModifierFlags::PUBLIC;
849 fieldModifiers |= ir::ModifierFlags::DECLARE;
852 auto *field = AllocNode<ir::ClassProperty>(name, nullptr, typeAnnotation->Clone(Allocator(), nullptr),
855 field->AddModifier(ir::ModifierFlags::OPTIONAL);
862 ir::MethodDefinition *ETSParser::ParseInterfaceMethod(ir::ModifierFlags flags, ir::MethodDefinitionKind methodKind)
865 auto *name = AllocNode<ir::Identifier>(Lexer()->GetToken().Ident(), Allocator());
875 ir::BlockStatement *body = nullptr;
879 flags |= ir::ModifierFlags::DECLARE;
883 if (methodKind == ir::MethodDefinitionKind::SET || methodKind == ir::MethodDefinitionKind::GET) {
887 } else if ((flags & (ir::ModifierFlags::PRIVATE | ir::ModifierFlags::STATIC)) != 0 && !isDeclare) {
894 functionContext.AddFlag(ir::ScriptFunctionFlags::HAS_RETURN);
898 auto *func = AllocNode<ir::ScriptFunction>(
899 Allocator(), ir::ScriptFunction::ScriptFunctionData {body, std::move(signature), functionContext.Flags(), flags,
902 if ((flags & ir::ModifierFlags::STATIC) == 0 && body == nullptr) {
903 func->AddModifier(ir::ModifierFlags::ABSTRACT);
910 auto *funcExpr = AllocNode<ir::FunctionExpression>(func);
912 func->AddFlag(ir::ScriptFunctionFlags::METHOD);
915 auto *method = AllocNode<ir::MethodDefinition>(methodKind, name->Clone(Allocator(), nullptr)->AsExpression(),
926 ir::AstNode *ETSParser::ParseTypeLiteralOrInterfaceMember()
929 ir::ModifierFlags methodFlags = ParseInterfaceMethodModifiers();
930 if (methodFlags != ir::ModifierFlags::NONE) {
931 if ((methodFlags & ir::ModifierFlags::PRIVATE) == 0) {
932 methodFlags |= ir::ModifierFlags::PUBLIC;
935 auto *method = ParseInterfaceMethod(methodFlags, ir::MethodDefinitionKind::METHOD);
949 field->AddModifier(ir::ModifierFlags::READONLY);
956 auto *method = ParseInterfaceMethod(ir::ModifierFlags::PUBLIC, ir::MethodDefinitionKind::METHOD);
972 bool ETSParser::CheckClassElement(ir::AstNode *property, [[maybe_unused]] ir::MethodDefinition *&ctor,
973 [[maybe_unused]] ArenaVector<ir::AstNode *> &properties)
981 auto *id = AllocNode<ir::Identifier>(compiler::Signatures::CCTOR, Allocator());
997 if (method->Kind() == ir::MethodDefinitionKind::METHOD) {
1004 void ETSParser::CheckPredefinedMethods(ir::ScriptFunction const *function, const lexer::SourcePosition &position) const
1010 ThrowSyntaxError(std::string {ir::PREDEFINED_METHOD} + std::string {name.Utf8()} +
1026 ThrowSyntaxError(std::string {ir::PREDEFINED_METHOD} + std::string {name.Utf8()} +
1042 ThrowSyntaxError(std::string {ir::PREDEFINED_METHOD} + std::string {name.Utf8()} +
1050 ThrowSyntaxError(std::string {ir::PREDEFINED_METHOD} + std::string {name.Utf8()} +
1057 void ETSParser::CreateImplicitConstructor([[maybe_unused]] ir::MethodDefinition *&ctor,
1058 ArenaVector<ir::AstNode *> &properties,
1059 [[maybe_unused]] ir::ClassDefinitionModifiers modifiers,
1062 if (std::any_of(properties.cbegin(), properties.cend(), [](ir::AstNode *prop) {
1068 if ((modifiers & ir::ClassDefinitionModifiers::ANONYMOUS) != 0) {
1072 auto *methodDef = BuildImplicitConstructor(ir::ClassDefinitionModifiers::SET_CTOR_ID, startLoc);
1076 std::pair<ir::ModifierFlags, lexer::SourcePosition> ETSParser::ParseMemberModifiers()
1078 auto memberModifiers = ir::ModifierFlags::STATIC | ir::ModifierFlags::PUBLIC;
1083 memberModifiers |= ir::ModifierFlags::DEFAULT_EXPORT;
1088 memberModifiers |= ir::ModifierFlags::EXPORT_TYPE;
1090 memberModifiers |= ir::ModifierFlags::EXPORT;
1098 memberModifiers |= ir::ModifierFlags::DECLARE;
1105 memberModifiers |= ir::ModifierFlags::ASYNC;
1107 memberModifiers |= ir::ModifierFlags::NATIVE;