diff --git a/src/auto/injector.js b/src/auto/injector.js index 80db9ee68e52..d4337ffd0448 100644 --- a/src/auto/injector.js +++ b/src/auto/injector.js @@ -722,13 +722,14 @@ function createInjector(modulesToLoad, strictDi) { if (loadedModules.get(module)) return; loadedModules.put(module, true); - function runInvokeQueue(queue) { + function runInvokeQueue(queue, moduleFn) { var i, ii; for (i = 0, ii = queue.length; i < ii; i++) { var invokeArgs = queue[i], provider = providerInjector.get(invokeArgs[0]); - - provider[invokeArgs[1]].apply(provider, invokeArgs[2]); + var args = Array.prototype.slice.call(invokeArgs[2]); + args.push(moduleFn); // add the module function here + provider[invokeArgs[1]].apply(provider, args); } } @@ -736,8 +737,8 @@ function createInjector(modulesToLoad, strictDi) { if (isString(module)) { moduleFn = angularModule(module); runBlocks = runBlocks.concat(loadModules(moduleFn.requires)).concat(moduleFn._runBlocks); - runInvokeQueue(moduleFn._invokeQueue); - runInvokeQueue(moduleFn._configBlocks); + runInvokeQueue(moduleFn._invokeQueue, moduleFn); + runInvokeQueue(moduleFn._configBlocks, moduleFn); } else if (isFunction(module)) { runBlocks.push(providerInjector.invoke(module)); } else if (isArray(module)) { diff --git a/src/ng/compile.js b/src/ng/compile.js index 0aba65aec107..6e7c5d9a0c83 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -819,7 +819,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { * {@link guide/directive} for more info. * @returns {ng.$compileProvider} Self for chaining. */ - this.directive = function registerDirective(name, directiveFactory) { + this.directive = function registerDirective(name, directiveFactory, ngModule) { assertNotHasOwnProperty(name, 'directive'); if (isString(name)) { assertValidDirectiveName(name); @@ -837,6 +837,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { } else if (!directive.compile && directive.link) { directive.compile = valueFn(directive.link); } + directive.ngModule = ngModule; directive.priority = directive.priority || 0; directive.index = index; directive.name = directive.name || name; @@ -2299,7 +2300,15 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { function assertNoDuplicate(what, previousDirective, directive, element) { if (previousDirective) { throw $compileMinErr('multidir', 'Multiple directives [{0}, {1}] asking for {2} on: {3}', - previousDirective.name, directive.name, what, startingTag(element)); + getDirectiveLabel(previousDirective), getDirectiveLabel(directive), what, startingTag(element)); + } + + function getDirectiveLabel(dir) { + if (dir.ngModule) { + return dir.name + ' (module: ' + dir.ngModule.name + ')'; + } else { + return dir.name; + } } } diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js index b89f1d08312c..1360472bb81f 100755 --- a/test/ng/compileSpec.js +++ b/test/ng/compileSpec.js @@ -2113,6 +2113,7 @@ describe('$compile', function() { var iscope; beforeEach(module(function() { + var fakeModule = {name: 'fakeModule'}; forEach(['', 'a', 'b'], function(name) { directive('scope' + uppercase(name), function(log) { return { @@ -2125,7 +2126,7 @@ describe('$compile', function() { }}; } }; - }); + }, fakeModule); directive('iscope' + uppercase(name), function(log) { return { scope: {}, @@ -2138,7 +2139,7 @@ describe('$compile', function() { }; } }; - }); + }, fakeModule); directive('tscope' + uppercase(name), function(log) { return { scope: true, @@ -2320,7 +2321,7 @@ describe('$compile', function() { function($rootScope, $compile) { expect(function() { $compile('
'); - }).toThrowMinErr('$compile', 'multidir', 'Multiple directives [iscopeA, scopeB] asking for new/isolated scope on: ' + + }).toThrowMinErr('$compile', 'multidir', 'Multiple directives [iscopeA (module: fakeModule), scopeB (module: fakeModule)] asking for new/isolated scope on: ' + '