BfResolvePass.cpp 5.6 KB

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