(fragment1: SplootFragment, fragment2: SplootFragment)
| 135 | |
| 136 | // Note: fragment1 will always be added to fragment2, not the other way around. |
| 137 | export function combineFragments(fragment1: SplootFragment, fragment2: SplootFragment): SplootFragment { |
| 138 | if (fragment1 === null) { |
| 139 | return fragment2 |
| 140 | } |
| 141 | if (fragment1.nodeCategory === fragment2.nodeCategory) { |
| 142 | return new SplootFragment(fragment1.nodes.concat(fragment2.nodes), fragment2.nodeCategory) |
| 143 | } |
| 144 | |
| 145 | const destCategory = fragment2.nodeCategory |
| 146 | |
| 147 | const adapters = fragmentAdapterMapping.get(fragment1.nodeCategory) |
| 148 | if (adapters && adapters.has(destCategory)) { |
| 149 | const node = adapters.get(destCategory)(fragment1) |
| 150 | return new SplootFragment([node, ...fragment2.nodes], fragment2.nodeCategory) |
| 151 | } |
| 152 | |
| 153 | const valid = fragment1.nodes.filter((node) => isAdaptableToPasteDesintation(node, destCategory)) |
| 154 | if (fragment1.nodes.length == valid.length) { |
| 155 | const adaptedNodes = fragment1.nodes.map((node) => { |
| 156 | const adaptedNode = adaptNodeToPasteDestination(node, destCategory) |
| 157 | // Need to clean here so that empty expressions get removed from statement nodes. |
| 158 | adaptedNode.clean() |
| 159 | return adaptedNode |
| 160 | }) |
| 161 | return new SplootFragment(adaptedNodes.concat(fragment2.nodes), fragment2.nodeCategory) |
| 162 | } |
| 163 | |
| 164 | return fragment2 |
| 165 | } |
no test coverage detected