1
1
package com.prezi.spaghetti.config
2
2
3
3
import com.prezi.spaghetti.ast.ModuleNode
4
+ import com.prezi.spaghetti.ast.parser.AstParserException
4
5
import com.prezi.spaghetti.ast.parser.MissingTypeResolver
5
6
import com.prezi.spaghetti.ast.parser.ModuleParser
6
7
import com.prezi.spaghetti.ast.parser.ModuleTypeResolver
@@ -15,19 +16,27 @@ class ModuleConfigurationParser {
15
16
Collection<ModuleDefinitionSource > localModuleSources ,
16
17
Collection<ModuleDefinitionSource > dependentModuleSources ,
17
18
Collection<ModuleDefinitionSource > transitiveModuleSources ) {
19
+ Set<String > parsedModules = []
18
20
def configNode = new DefaultModuleConfiguration ()
19
- def transitiveResolver = resolveModules (MissingTypeResolver . INSTANCE , transitiveModuleSources, configNode. transitiveDependentModules)
20
- def directResolver = resolveModules (transitiveResolver, dependentModuleSources, configNode. directDependentModules)
21
- resolveModules (directResolver, localModuleSources, configNode. localModules)
21
+ def transitiveResolver = parseModules (MissingTypeResolver . INSTANCE , transitiveModuleSources, configNode. transitiveDependentModules, parsedModules )
22
+ def directResolver = parseModules (transitiveResolver, dependentModuleSources, configNode. directDependentModules, parsedModules )
23
+ parseModules (directResolver, localModuleSources, configNode. localModules, parsedModules )
22
24
return configNode
23
25
}
24
26
25
- static TypeResolver resolveModules (TypeResolver parentResolver , Collection<ModuleDefinitionSource > sources , Set<ModuleNode > moduleNodes ) {
27
+ static TypeResolver parseModules (TypeResolver parentResolver , Collection<ModuleDefinitionSource > sources , Set<ModuleNode > moduleNodes , Set< String > allModuleNames ) {
26
28
List<ModuleParser > parsers = sources. collect { ModuleParser . create(it) }
27
29
def resolver = parsers. inject(parentResolver) {
28
30
TypeResolver resolver, parser -> new ModuleTypeResolver (resolver, parser. module)
29
31
}
30
- moduleNodes. addAll parsers* . parse(resolver)
32
+ parsers. each { parser ->
33
+ def module = parser. parse(resolver)
34
+ if (allModuleNames. contains(module. name)) {
35
+ throw new AstParserException (module. source, " : module loaded multiple times: ${ module.name} " )
36
+ }
37
+ allModuleNames. add(module. name)
38
+ moduleNodes. add module
39
+ }
31
40
return resolver
32
41
}
33
42
}
0 commit comments