| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'dart:async'; |
| import 'dart:collection'; |
| import 'dart:convert'; |
| import 'dart:io'; |
| |
| import 'package:analyzer/dart/analysis/analysis_context_collection.dart'; |
| import 'package:analyzer/dart/analysis/analysis_context.dart'; |
| import 'package:analyzer/dart/analysis/session.dart'; |
| import 'package:analyzer/dart/ast/ast.dart'; |
| import 'package:analyzer/file_system/physical_file_system.dart'; |
| import 'package:path/path.dart' as p; |
| |
| import 'src/visitor.dart'; |
| |
| // Analyze the given library source files and returns a map structure |
| // representing all publicly available information in the library. |
| Future<String> analyzeAPI(String apiName, List<String> sources) async { |
| SplayTreeMap<String, dynamic> package = SplayTreeMap(); |
| package['name'] = apiName; |
| package['type'] = 'package'; |
| package['files'] = SplayTreeMap<String, dynamic>(); |
| |
| AnalysisContextCollection collection = AnalysisContextCollection( |
| includedPaths: sources, |
| resourceProvider: PhysicalResourceProvider.INSTANCE); |
| |
| for (AnalysisContext context in collection.contexts) { |
| for (String path in context.contextRoot.analyzedFiles()) { |
| var myFile = File(path); |
| String filename = p.basename(myFile.path); |
| |
| // The .packages file should be included in sources, |
| // but we don't want to directly parse that file here. |
| if (filename.endsWith('.dart') && !Identifier.isPrivateName(filename)) { |
| DetectChangesVisitor d = DetectChangesVisitor(filename); |
| |
| AnalysisSession session = context.currentSession; |
| var result = await session.getResolvedUnit(path); |
| result.unit.accept(d); |
| |
| package['files'][filename] = d.file; |
| } |
| } |
| } |
| |
| JsonEncoder encoder = JsonEncoder.withIndent(' '); |
| return encoder.convert(package); |
| } |