BfResolvePass.cpp 6.5 KB

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