1 | var utils = require("../utils");
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 | var CODE_ELEMENT_TYPES = {
|
13 | BRANCH: "branch",
|
14 | METHOD: "method"
|
15 | };
|
16 | function SourceDataEnricher(generatedSignature, sourceSignatures, logger) {
|
17 | this.generatedSignature = generatedSignature;
|
18 | this.sourceSignatures = sourceSignatures;
|
19 | this.logger = logger;
|
20 | }
|
21 |
|
22 |
|
23 |
|
24 |
|
25 | SourceDataEnricher.prototype.enrichData = function(){
|
26 | var context = this;
|
27 | this.sourceSignatures.forEach(function (sourceSig) {
|
28 | if(!sourceSig) {
|
29 | context.logger.error("Source signature is undefined, skipping enrichment");
|
30 | return;
|
31 | }
|
32 | var sourcePositionMap = context.generatedSignature.sourcePositionMappers[sourceSig.absolutePath];
|
33 | context.enrichMethods(sourcePositionMap, sourceSig);
|
34 | context.enrichBranches(sourcePositionMap, sourceSig);
|
35 | })
|
36 | }
|
37 |
|
38 | SourceDataEnricher.prototype.enrichMethods = function(sourcePositionMap, sourceSig) {
|
39 | var context = this;
|
40 | var generatedMethodsArray = context.generatedSignature.methods;
|
41 | var sourceMethodsArray = sourceSig.methods;
|
42 | this.enrichProcedure(sourcePositionMap.getMethodsPosition(), sourceSig, generatedMethodsArray, sourceMethodsArray, sourcePositionMap,
|
43 | sourceSig.positionToMethodMap,CODE_ELEMENT_TYPES.METHOD);
|
44 | }
|
45 |
|
46 | SourceDataEnricher.prototype.enrichBranches = function(sourcePositionMap, sourceSig) {
|
47 | var context = this;
|
48 | var generatedBranchArray = context.generatedSignature.branches;
|
49 | var sourceBranchesArray = sourceSig.branches;
|
50 | this.enrichProcedure(sourcePositionMap.getBranchesPosition(), sourceSig, generatedBranchArray, sourceBranchesArray, sourcePositionMap,
|
51 | sourceSig.positionToBranchMap, CODE_ELEMENT_TYPES.BRANCH);
|
52 | }
|
53 |
|
54 | SourceDataEnricher.prototype.handleAutoGeneratedElement = function (elementType, position, sourceSig, generatedElement) {
|
55 | this.logger.info("Couldn't find %s at position '%s' in file '%s', but it got generate as %s." +
|
56 | "marked as auto generate code", elementType, position, sourceSig.absolutePath, elementType);
|
57 | generatedElement.techSpecificInfo["autoGenerated"] = true;
|
58 | }
|
59 |
|
60 | SourceDataEnricher.prototype.enrichProcedure= function(srcPositionsArr, sourceSig, genElementsArr, srcElementsArr,
|
61 | srcPositionToGenElementIdx, srcPositionToSrcElementIdx, codeElementType) {
|
62 | var context = this;
|
63 | srcPositionsArr.forEach(function (srcPosition) {
|
64 | var sourceElementIndex = srcPositionToSrcElementIdx[srcPosition];
|
65 | var getGenIdxMethod = codeElementType === CODE_ELEMENT_TYPES.METHOD ? srcPositionToGenElementIdx.getMethodIndex : srcPositionToGenElementIdx.getBranchIndex;
|
66 | var generatedElementIndex = getGenIdxMethod.call(srcPositionToGenElementIdx, srcPosition);
|
67 | var generatedElement = genElementsArr[generatedElementIndex];
|
68 | var sourceElement = srcElementsArr[sourceElementIndex];
|
69 | if (generatedElement == null) {
|
70 | context.logger.warn("%s with source position '%s' in file '%s', is null", codeElementType, srcPosition, context.generatedSignature.absolutePath);
|
71 | }
|
72 | else if (sourceElement == null) {
|
73 | context.handleAutoGeneratedElement(codeElementType, srcPosition, sourceSig, generatedElement);
|
74 | }
|
75 | else if(codeElementType == CODE_ELEMENT_TYPES.METHOD) {
|
76 | updateMethodInfo(generatedElement, sourceElement);
|
77 | }
|
78 | })
|
79 | }
|
80 |
|
81 | function updateMethodInfo(generatedMethod, sourceMethod) {
|
82 | generatedMethod.meta = utils.cloneObject(sourceMethod.meta);
|
83 | generatedMethod.techSpecificInfo = utils.cloneObject(sourceMethod.techSpecificInfo);
|
84 | if (sourceMethod.techSpecificInfo.isAsync) {
|
85 | generatedMethod.srcData.hash = sourceMethod.generatedData.hash;
|
86 | generatedMethod.srcData.sigHash = sourceMethod.generatedData.sigHash;
|
87 | }
|
88 | }
|
89 | module.exports = SourceDataEnricher; |
\ | No newline at end of file |