| Index: tools/patch_sdk.dart
 | 
| diff --git a/tools/patch_sdk.dart b/tools/patch_sdk.dart
 | 
| index 3bb9965ec32def7758b8f5d176f55a70256b496f..d92f0a693a0142536abe867c6d3ed99918df741e 100644
 | 
| --- a/tools/patch_sdk.dart
 | 
| +++ b/tools/patch_sdk.dart
 | 
| @@ -264,6 +264,17 @@ List<String> _patchLibrary(String name,
 | 
|      partUnit.accept(new PatchApplier(partEdits, patchFinder));
 | 
|      results.add(partEdits);
 | 
|    }
 | 
| +
 | 
| +  if (patchFinder.patches.length != patchFinder.applied.length) {
 | 
| +    print('Some elements marked as @patch do not have corresponding elements:');
 | 
| +    for (var patched in patchFinder.patches.keys) {
 | 
| +      if (!patchFinder.applied.contains(patched)) {
 | 
| +        print('*** ${patched}');
 | 
| +      }
 | 
| +    }
 | 
| +    throw "Failed to apply all @patch-es";
 | 
| +  }
 | 
| +
 | 
|    return new List<String>.from(results.map((e) => e.toString()));
 | 
|  }
 | 
|  
 | 
| @@ -343,14 +354,16 @@ class PatchApplier extends GeneralizingAstVisitor {
 | 
|      if (node is FieldDeclaration) return;
 | 
|  
 | 
|      var externalKeyword = (node as dynamic).externalKeyword;
 | 
| -    if (externalKeyword == null) return;
 | 
|  
 | 
|      var name = _qualifiedName(node);
 | 
|      var patchNode = patch.patches[name];
 | 
|      if (patchNode == null) {
 | 
| -      print('warning: patch not found for $name: $node');
 | 
| +      if (externalKeyword != null) {
 | 
| +        print('warning: patch not found for $name: $node');
 | 
| +      }
 | 
|        return;
 | 
|      }
 | 
| +    patch.applied.add(name);
 | 
|  
 | 
|      Annotation patchMeta = patchNode.metadata.lastWhere(_isPatchAnnotation);
 | 
|      int start = patchMeta.endToken.next.offset;
 | 
| @@ -359,7 +372,7 @@ class PatchApplier extends GeneralizingAstVisitor {
 | 
|      // For some node like static fields, the node's offset doesn't include
 | 
|      // the external keyword. Also starting from the keyword lets us preserve
 | 
|      // documentation comments.
 | 
| -    edits.replace(externalKeyword.offset, node.end, code);
 | 
| +    edits.replace(externalKeyword?.offset ?? node.offset, node.end, code);
 | 
|    }
 | 
|  }
 | 
|  
 | 
| @@ -370,6 +383,7 @@ class PatchFinder extends GeneralizingAstVisitor {
 | 
|    final Map patches = <String, Declaration>{};
 | 
|    final Map mergeMembers = <String, List<ClassMember>>{};
 | 
|    final List mergeDeclarations = <CompilationUnitMember>[];
 | 
| +  final Set<String> applied = new Set<String>();
 | 
|  
 | 
|    PatchFinder.parseAndVisit(String name, String contents)
 | 
|        : contents = contents,
 | 
| 
 |