BfResolvePass.cpp 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. #include "BfResolvePass.h"
  2. #include "BfParser.h"
  3. #include "BfModule.h"
  4. USING_NS_BF;
  5. BfResolvePassData::BfResolvePassData()
  6. {
  7. mGetSymbolReferenceKind = BfGetSymbolReferenceKind_None;
  8. mSymbolReferenceTypeDef = NULL;
  9. mSymbolReferenceLocalIdx = -1;
  10. mSymbolReferenceFieldIdx = -1;
  11. mSymbolReferenceMethodIdx = -1;
  12. mSymbolReferencePropertyIdx = -1;
  13. mSymbolMethodGenericParamIdx = -1;
  14. mSymbolTypeGenericParamIdx = -1;
  15. mAutoComplete = NULL;
  16. mResolveType = BfResolveType_None;
  17. mIsClassifying = false;
  18. mHasCursorIdx = false;
  19. mHadEmits = false;
  20. }
  21. BfResolvePassData::~BfResolvePassData()
  22. {
  23. for (auto& emitEntryKV : mEmitEmbedEntries)
  24. {
  25. auto parser = emitEntryKV.mValue.mParser;
  26. if (parser != NULL)
  27. {
  28. delete parser->mSourceClassifier;
  29. parser->mSourceClassifier = NULL;
  30. parser->mParserFlags = ParserFlag_None;
  31. parser->mCursorCheckIdx = -1;
  32. }
  33. }
  34. }
  35. void BfResolvePassData::RecordReplaceNode(BfParserData* parser, int srcStart, int srcLen)
  36. {
  37. String* stringPtr = NULL;
  38. if (!mFoundSymbolReferencesParserData.TryAdd(parser, NULL, &stringPtr))
  39. {
  40. *stringPtr += " ";
  41. }
  42. *stringPtr += StrFormat("%d %d", srcStart, srcLen);
  43. }
  44. void BfResolvePassData::RecordReplaceNode(BfAstNode* node)
  45. {
  46. if (node->IsTemporary())
  47. return;
  48. auto parser = node->GetSourceData()->ToParserData();
  49. if (node->GetSrcStart() >= parser->mSrcLength)
  50. return;
  51. while (true)
  52. {
  53. if (auto qualifiedName = BfNodeDynCast<BfQualifiedNameNode>(node))
  54. {
  55. node = qualifiedName->mRight;
  56. }
  57. else
  58. break;
  59. }
  60. RecordReplaceNode(parser, node->GetSrcStart(), node->GetSrcLength());
  61. }
  62. void BfResolvePassData::HandleMethodReference(BfAstNode* node, BfTypeDef* typeDef, BfMethodDef* methodDef)
  63. {
  64. if ((mGetSymbolReferenceKind == BfGetSymbolReferenceKind_Method) && (mSymbolReferenceTypeDef == typeDef->GetDefinition()) &&
  65. (mSymbolReferenceMethodIdx == methodDef->mIdx))
  66. RecordReplaceNode(node);
  67. }
  68. void BfResolvePassData::HandleFieldReference(BfAstNode* node, BfTypeDef* typeDef, BfFieldDef* fieldDef)
  69. {
  70. if ((mGetSymbolReferenceKind == BfGetSymbolReferenceKind_Field) && (mSymbolReferenceTypeDef == typeDef->GetDefinition()) &&
  71. (mSymbolReferenceFieldIdx == fieldDef->mIdx))
  72. RecordReplaceNode(node);
  73. }
  74. void BfResolvePassData::HandlePropertyReference(BfAstNode* node, BfTypeDef* typeDef, BfPropertyDef* propDef)
  75. {
  76. if ((mGetSymbolReferenceKind == BfGetSymbolReferenceKind_Property) && (mSymbolReferenceTypeDef == typeDef->GetDefinition()) &&
  77. (mSymbolReferencePropertyIdx == propDef->mIdx))
  78. RecordReplaceNode(node);
  79. }
  80. void BfResolvePassData::HandleLocalReference(BfIdentifierNode* identifier, BfTypeDef* typeDef, BfMethodDef* methodDef, int localVarIdx)
  81. {
  82. if ((mGetSymbolReferenceKind == BfGetSymbolReferenceKind_Local) && (mSymbolReferenceTypeDef == typeDef->GetDefinition()) &&
  83. (mSymbolReferenceMethodIdx == methodDef->mIdx) && (localVarIdx == mSymbolReferenceLocalIdx))
  84. RecordReplaceNode(identifier);
  85. }
  86. void BfResolvePassData::HandleTypeGenericParam(BfAstNode* node, BfTypeDef* typeDef, int genericParamIdx)
  87. {
  88. if ((mGetSymbolReferenceKind == BfGetSymbolReferenceKind_TypeGenericParam) && (mSymbolReferenceTypeDef == typeDef->GetDefinition()) && (genericParamIdx == mSymbolTypeGenericParamIdx))
  89. RecordReplaceNode(node);
  90. }
  91. void BfResolvePassData::HandleMethodGenericParam(BfAstNode* node, BfTypeDef* typeDef, BfMethodDef* methodDef, int genericParamIdx)
  92. {
  93. if ((mGetSymbolReferenceKind == BfGetSymbolReferenceKind_MethodGenericParam) && (mSymbolReferenceTypeDef == typeDef->GetDefinition()) &&
  94. (mSymbolReferenceMethodIdx == methodDef->mIdx) && (genericParamIdx == mSymbolMethodGenericParamIdx))
  95. RecordReplaceNode(node);
  96. }
  97. void BfResolvePassData::HandleLocalReference(BfIdentifierNode* identifier, BfIdentifierNode* origNameNode, BfTypeDef* typeDef, BfMethodDef* methodDef, int localVarIdx)
  98. {
  99. if ((mGetSymbolReferenceKind == BfGetSymbolReferenceKind_Local) && (mSymbolReferenceTypeDef == typeDef->GetDefinition()) &&
  100. (mSymbolReferenceMethodIdx == methodDef->mIdx) && (localVarIdx == mSymbolReferenceLocalIdx))
  101. {
  102. if (origNameNode == NULL)
  103. origNameNode = identifier;
  104. int origLen = origNameNode->GetSrcLength();
  105. int refLen = identifier->GetSrcLength();
  106. // The lengths can be different if we have one or more @'s prepended
  107. RecordReplaceNode(identifier->GetSourceData()->ToParserData(), identifier->GetSrcStart() + (refLen - origLen), origLen);
  108. }
  109. }
  110. BfAstNode* BfResolvePassData::FindBaseNode(BfAstNode* node)
  111. {
  112. BfAstNode* baseNode = node;
  113. while (true)
  114. {
  115. if (auto qualifiedTypeRef = BfNodeDynCast<BfQualifiedTypeReference>(baseNode))
  116. {
  117. baseNode = qualifiedTypeRef->mRight;
  118. }
  119. else if (auto elementedTypeRef = BfNodeDynCast<BfElementedTypeRef>(baseNode))
  120. {
  121. baseNode = elementedTypeRef->mElementType;
  122. }
  123. else if (auto namedTypeRef = BfNodeDynCast<BfNamedTypeReference>(baseNode))
  124. {
  125. baseNode = namedTypeRef->mNameNode;
  126. }
  127. else if (auto qualifiedNameNode = BfNodeDynCast<BfQualifiedNameNode>(baseNode))
  128. {
  129. baseNode = qualifiedNameNode->mRight;
  130. }
  131. else if (auto declTypeRef = BfNodeDynCast<BfExprModTypeRef>(baseNode))
  132. {
  133. baseNode = NULL;
  134. break;
  135. }
  136. else
  137. break;
  138. }
  139. return baseNode;
  140. }
  141. void BfResolvePassData::HandleTypeReference(BfAstNode* node, BfTypeDef* typeDef)
  142. {
  143. if ((mGetSymbolReferenceKind == BfGetSymbolReferenceKind_Type) && (mSymbolReferenceTypeDef == typeDef->GetDefinition()))
  144. {
  145. auto baseNode = FindBaseNode(node);
  146. if (baseNode != NULL)
  147. RecordReplaceNode(baseNode);
  148. }
  149. }
  150. void BfResolvePassData::HandleNamespaceReference(BfAstNode* node, const BfAtomComposite& namespaceName)
  151. {
  152. if ((mGetSymbolReferenceKind == BfGetSymbolReferenceKind_Namespace) && (namespaceName.StartsWith(mSymbolReferenceNamespace)))
  153. {
  154. BfAstNode* recordNode = node;
  155. int leftCount = namespaceName.mSize - mSymbolReferenceNamespace.mSize;
  156. for (int i = 0; i < leftCount; i++)
  157. {
  158. if (auto qualifiedTypeRef = BfNodeDynCast<BfQualifiedTypeReference>(recordNode))
  159. {
  160. recordNode = qualifiedTypeRef->mLeft;
  161. }
  162. else if (auto qualifiedNameNode = BfNodeDynCast<BfQualifiedNameNode>(recordNode))
  163. {
  164. recordNode = qualifiedNameNode->mLeft;
  165. }
  166. else
  167. return;
  168. }
  169. auto baseNode = FindBaseNode(recordNode);
  170. if (baseNode != NULL)
  171. RecordReplaceNode(baseNode);
  172. }
  173. }
  174. BfSourceClassifier* BfResolvePassData::GetSourceClassifier(BfAstNode* astNode)
  175. {
  176. if (!mIsClassifying)
  177. return NULL;
  178. if (astNode == NULL)
  179. return NULL;
  180. auto parser = astNode->GetParser();
  181. if (parser == NULL)
  182. return NULL;
  183. return parser->mSourceClassifier;
  184. }
  185. BfSourceClassifier* BfResolvePassData::GetSourceClassifier(BfParser* parser)
  186. {
  187. if (!mIsClassifying)
  188. return NULL;
  189. if (parser == NULL)
  190. return NULL;
  191. return parser->mSourceClassifier;
  192. }