Skip to content

Commit 8274cd1

Browse files
SONARARMOR-1576 Implement parsing support of JSX nodes (#5884)
1 parent 9324ae3 commit 8274cd1

File tree

7 files changed

+1580
-248
lines changed

7 files changed

+1580
-248
lines changed

packages/jsts/src/parsers/ast.ts

Lines changed: 226 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,12 +331,59 @@ function getProtobufShapeForNode(node: TSESTree.Node) {
331331
case 'TSModuleDeclaration':
332332
shape = visitTSModuleDeclaration(node);
333333
break;
334+
// JSX node types
335+
case 'JSXElement':
336+
shape = visitJSXElement(node);
337+
break;
338+
case 'JSXFragment':
339+
shape = visitJSXFragment(node);
340+
break;
341+
case 'JSXOpeningElement':
342+
shape = visitJSXOpeningElement(node);
343+
break;
344+
case 'JSXClosingElement':
345+
shape = visitJSXClosingElement(node);
346+
break;
347+
case 'JSXOpeningFragment':
348+
shape = visitJSXOpeningFragment(node);
349+
break;
350+
case 'JSXClosingFragment':
351+
shape = visitJSXClosingFragment(node);
352+
break;
353+
case 'JSXAttribute':
354+
shape = visitJSXAttribute(node);
355+
break;
356+
case 'JSXIdentifier':
357+
shape = visitJSXIdentifier(node);
358+
break;
359+
case 'JSXMemberExpression':
360+
shape = visitJSXMemberExpression(node);
361+
break;
362+
case 'JSXNamespacedName':
363+
shape = visitJSXNamespacedName(node);
364+
break;
365+
case 'JSXSpreadAttribute':
366+
shape = visitJSXSpreadAttribute(node);
367+
break;
368+
case 'JSXExpressionContainer':
369+
shape = visitJSXExpressionContainer(node);
370+
break;
371+
case 'JSXSpreadChild':
372+
shape = visitJSXSpreadChild(node);
373+
break;
374+
case 'JSXText':
375+
shape = visitJSXText(node);
376+
break;
377+
case 'JSXEmptyExpression':
378+
shape = visitJSXEmptyExpression(node);
379+
break;
334380
case 'TSTypeAliasDeclaration':
335381
case 'TSInterfaceDeclaration':
336382
case 'TSEmptyBodyFunctionExpression':
337383
case 'TSEnumDeclaration':
338384
case 'TSDeclareFunction':
339385
case 'TSAbstractMethodDefinition':
386+
case 'TSTypeParameterInstantiation':
340387
shape = {};
341388
break;
342389
default:
@@ -956,3 +1003,182 @@ function visitTSParameterProperty(node: TSESTree.TSParameterProperty) {
9561003
export function lowerCaseFirstLetter(str: string) {
9571004
return str.charAt(0).toLowerCase() + str.slice(1);
9581005
}
1006+
1007+
function visitJSXElement(node: TSESTree.JSXElement) {
1008+
/*
1009+
* export interface JSXElement extends BaseNode {
1010+
* type: AST_NODE_TYPES.JSXElement;
1011+
* children: JSXChild[];
1012+
* closingElement: JSXClosingElement | null;
1013+
* openingElement: JSXOpeningElement;
1014+
* }
1015+
*/
1016+
return {
1017+
openingElement: visitNode(node.openingElement),
1018+
closingElement: visitNode(node.closingElement),
1019+
children: node.children.map(visitNode),
1020+
};
1021+
}
1022+
function visitJSXFragment(node: TSESTree.JSXFragment) {
1023+
/*
1024+
* export interface JSXFragment extends BaseNode {
1025+
* type: AST_NODE_TYPES.JSXFragment;
1026+
* children: JSXChild[];
1027+
* closingFragment: JSXClosingFragment;
1028+
* openingFragment: JSXOpeningFragment;
1029+
* }
1030+
*/
1031+
return {
1032+
openingFragment: visitNode(node.openingFragment),
1033+
closingFragment: visitNode(node.closingFragment),
1034+
children: node.children.map(visitNode),
1035+
};
1036+
}
1037+
function visitJSXOpeningElement(node: TSESTree.JSXOpeningElement) {
1038+
/*
1039+
* export interface JSXOpeningElement extends BaseNode {
1040+
* type: AST_NODE_TYPES.JSXOpeningElement;
1041+
* attributes: (JSXAttribute | JSXSpreadAttribute)[];
1042+
* name: JSXTagNameExpression;
1043+
* selfClosing: boolean;
1044+
* typeArguments: TSTypeParameterInstantiation | undefined;
1045+
* }
1046+
*/
1047+
return {
1048+
name: visitNode(node.name),
1049+
attributes: node.attributes.map(visitNode),
1050+
selfClosing: node.selfClosing,
1051+
typeArguments: visitNode(node.typeArguments),
1052+
};
1053+
}
1054+
function visitJSXClosingElement(node: TSESTree.JSXClosingElement) {
1055+
/*
1056+
* export interface JSXClosingElement extends BaseNode {
1057+
* type: AST_NODE_TYPES.JSXClosingElement;
1058+
* name: JSXIdentifier | JSXMemberExpression | JSXNamespacedName;
1059+
* }
1060+
*/
1061+
return {
1062+
name: visitNode(node.name),
1063+
};
1064+
}
1065+
function visitJSXOpeningFragment(_node: TSESTree.JSXOpeningFragment) {
1066+
/*
1067+
* export interface JSXOpeningFragment extends BaseNode {
1068+
* type: AST_NODE_TYPES.JSXOpeningFragment;
1069+
* }
1070+
*/
1071+
return {};
1072+
}
1073+
function visitJSXClosingFragment(_node: TSESTree.JSXClosingFragment) {
1074+
/*
1075+
* export interface JSXClosingFragment extends BaseNode {
1076+
* type: AST_NODE_TYPES.JSXClosingFragment;
1077+
* }
1078+
*/
1079+
return {};
1080+
}
1081+
function visitJSXAttribute(node: TSESTree.JSXAttribute) {
1082+
/*
1083+
* export interface JSXAttribute extends BaseNode {
1084+
* type: AST_NODE_TYPES.JSXAttribute;
1085+
* name: JSXIdentifier | JSXNamespacedName;
1086+
* value: JSXElement | JSXExpression | Literal | null;
1087+
* }
1088+
*/
1089+
return {
1090+
name: visitNode(node.name),
1091+
value: visitNode(node.value),
1092+
};
1093+
}
1094+
function visitJSXIdentifier(node: TSESTree.JSXIdentifier) {
1095+
/*
1096+
* export interface JSXIdentifier extends BaseNode {
1097+
* type: AST_NODE_TYPES.JSXIdentifier;
1098+
* name: string;
1099+
* }
1100+
*/
1101+
return {
1102+
name: node.name,
1103+
};
1104+
}
1105+
function visitJSXMemberExpression(node: TSESTree.JSXMemberExpression) {
1106+
/*
1107+
* export interface JSXMemberExpression extends BaseNode {
1108+
* type: AST_NODE_TYPES.JSXMemberExpression;
1109+
* object: JSXTagNameExpression;
1110+
* property: JSXIdentifier;
1111+
* }
1112+
*/
1113+
return {
1114+
object: visitNode(node.object),
1115+
property: visitNode(node.property),
1116+
};
1117+
}
1118+
function visitJSXNamespacedName(node: TSESTree.JSXNamespacedName) {
1119+
/*
1120+
* export interface JSXNamespacedName extends BaseNode {
1121+
* type: AST_NODE_TYPES.JSXNamespacedName;
1122+
* name: JSXIdentifier;
1123+
* namespace: JSXIdentifier;
1124+
* }
1125+
*/
1126+
return {
1127+
name: visitNode(node.name),
1128+
namespace: visitNode(node.namespace),
1129+
};
1130+
}
1131+
function visitJSXSpreadAttribute(node: TSESTree.JSXSpreadAttribute) {
1132+
/*
1133+
* export interface JSXSpreadAttribute extends BaseNode {
1134+
* type: AST_NODE_TYPES.JSXSpreadAttribute;
1135+
* argument: Expression;
1136+
* }
1137+
*/
1138+
return {
1139+
argument: visitNode(node.argument),
1140+
};
1141+
}
1142+
function visitJSXExpressionContainer(node: TSESTree.JSXExpressionContainer) {
1143+
/*
1144+
* export interface JSXExpressionContainer extends BaseNode {
1145+
* type: AST_NODE_TYPES.JSXExpressionContainer;
1146+
* expression: Expression | JSXEmptyExpression;
1147+
* }
1148+
*/
1149+
return {
1150+
expression: visitNode(node.expression),
1151+
};
1152+
}
1153+
function visitJSXSpreadChild(node: TSESTree.JSXSpreadChild) {
1154+
/*
1155+
* export interface JSXSpreadChild extends BaseNode {
1156+
* type: AST_NODE_TYPES.JSXSpreadChild;
1157+
* expression: Expression | JSXEmptyExpression;
1158+
* }
1159+
*/
1160+
return {
1161+
expression: visitNode(node.expression),
1162+
};
1163+
}
1164+
function visitJSXText(node: TSESTree.JSXText) {
1165+
/*
1166+
* export interface JSXText extends BaseNode {
1167+
* type: AST_NODE_TYPES.JSXText;
1168+
* raw: string;
1169+
* value: string;
1170+
* }
1171+
*/
1172+
return {
1173+
raw: node.raw,
1174+
value: node.value,
1175+
};
1176+
}
1177+
function visitJSXEmptyExpression(_node: TSESTree.JSXEmptyExpression) {
1178+
/*
1179+
* export interface JSXEmptyExpression extends BaseNode {
1180+
* type: AST_NODE_TYPES.JSXEmptyExpression;
1181+
* }
1182+
*/
1183+
return {};
1184+
}

packages/jsts/src/parsers/estree.proto

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,22 @@ enum NodeType {
100100
TSEnumDeclarationType = 81;
101101
TSDeclareFunctionType = 82;
102102
TSAbstractMethodDefinitionType = 83;
103+
TSTypeParameterInstantiationType = 84;
104+
JSXFragmentType = 85;
105+
JSXOpeningElementType = 86;
106+
JSXClosingElementType = 87;
107+
JSXOpeningFragmentType = 88;
108+
JSXClosingFragmentType = 89;
109+
JSXAttributeType = 90;
110+
JSXIdentifierType = 91;
111+
JSXMemberExpressionType = 92;
112+
JSXNamespacedNameType = 93;
113+
JSXSpreadAttributeType = 94;
114+
JSXExpressionContainerType = 95;
115+
JSXSpreadChildType = 96;
116+
JSXTextType = 97;
117+
JSXEmptyExpressionType = 98;
118+
JSXElementType = 99;
103119
UnknownNodeType = 1000;
104120
}
105121
message Node {
@@ -184,6 +200,21 @@ message Node {
184200
TSModuleBlock tSModuleBlock = 78;
185201
TSModuleDeclaration tSModuleDeclaration = 79;
186202
TSParameterProperty tSParameterProperty = 80;
203+
JSXElement jSXElement = 81;
204+
JSXFragment jSXFragment = 82;
205+
JSXOpeningElement jSXOpeningElement = 83;
206+
JSXClosingElement jSXClosingElement = 84;
207+
JSXOpeningFragment jSXOpeningFragment = 85;
208+
JSXClosingFragment jSXClosingFragment = 86;
209+
JSXAttribute jSXAttribute = 87;
210+
JSXIdentifier jSXIdentifier = 88;
211+
JSXMemberExpression jSXMemberExpression = 89;
212+
JSXNamespacedName jSXNamespacedName = 90;
213+
JSXSpreadAttribute jSXSpreadAttribute = 91;
214+
JSXExpressionContainer jSXExpressionContainer = 92;
215+
JSXSpreadChild jSXSpreadChild = 93;
216+
JSXText jSXText = 94;
217+
JSXEmptyExpression jSXEmptyExpression = 95;
187218
UnknownNode unknownNode = 1000;
188219
}
189220
}
@@ -518,5 +549,58 @@ message TSParameterProperty {
518549
bool readonly = 2;
519550
Node parameter = 3;
520551
}
552+
message JSXElement {
553+
Node openingElement = 1;
554+
optional Node closingElement = 2;
555+
repeated Node children = 3;
556+
}
557+
message JSXFragment {
558+
Node openingFragment = 1;
559+
Node closingFragment = 2;
560+
repeated Node children = 3;
561+
}
562+
message JSXOpeningElement {
563+
Node name = 1;
564+
repeated Node attributes = 2;
565+
bool selfClosing = 3;
566+
optional Node typeArguments = 4;
567+
}
568+
message JSXClosingElement {
569+
Node name = 1;
570+
}
571+
message JSXOpeningFragment {
572+
}
573+
message JSXClosingFragment {
574+
}
575+
message JSXAttribute {
576+
Node name = 1;
577+
optional Node value = 2;
578+
}
579+
message JSXIdentifier {
580+
string name = 1;
581+
}
582+
message JSXMemberExpression {
583+
Node object = 1;
584+
Node property = 2;
585+
}
586+
message JSXNamespacedName {
587+
Node name = 1;
588+
Node namespace = 2;
589+
}
590+
message JSXSpreadAttribute {
591+
Node argument = 1;
592+
}
593+
message JSXExpressionContainer {
594+
Node expression = 1;
595+
}
596+
message JSXSpreadChild {
597+
Node expression = 1;
598+
}
599+
message JSXText {
600+
string raw = 1;
601+
string value = 2;
602+
}
603+
message JSXEmptyExpression {
604+
}
521605
message UnknownNode {
522606
}

0 commit comments

Comments
 (0)