- Add VariableSpec class with magnitude field validation - Add Formula class supporting multiple input/output variables - Support d4rt_code as string or object with code field - Add comprehensive tests for parsing and serialization - Fix broken test import in pruebas_d4rt_test.dart Follows README.md format requirements exactly
178 lines
5.1 KiB
Dart
178 lines
5.1 KiB
Dart
import 'dart:io' as io;
|
|
|
|
import 'package:analyzer/file_system/overlay_file_system.dart';
|
|
import 'package:analyzer/file_system/physical_file_system.dart';
|
|
import 'package:analyzer/src/dart/analysis/analysis_context_collection.dart';
|
|
import 'package:analyzer/src/dart/analysis/byte_store.dart';
|
|
import 'package:analyzer/src/dart/analysis/performance_logger.dart';
|
|
import 'package:analyzer/src/util/performance/operation_performance.dart';
|
|
import 'package:linter/src/rules.dart';
|
|
|
|
void main() async {
|
|
var resourceProvider = OverlayResourceProvider(
|
|
PhysicalResourceProvider.INSTANCE,
|
|
);
|
|
|
|
registerLintRules();
|
|
|
|
var byteStore = NullByteStore();
|
|
|
|
var packageRootPath = '/Users/scheglov/dart/admin-portal';
|
|
var libPath = '$packageRootPath/lib';
|
|
|
|
// var builder = PackageConfigFileBuilder()
|
|
// ..add(
|
|
// name: 'test',
|
|
// rootPath: packageRootPath,
|
|
// );
|
|
//
|
|
// resourceProvider.setOverlay(
|
|
// '$packageRootPath/.dart_tool/package_config.json',
|
|
// content: builder.toContent(
|
|
// toUriStr: (path) {
|
|
// var pathContext = resourceProvider.pathContext;
|
|
// return pathContext.toUri(path).toString();
|
|
// },
|
|
// ),
|
|
// modificationStamp: 0,
|
|
// );
|
|
|
|
var modelPath = '$libPath/data/models/group_model.dart';
|
|
var modelCode = resourceProvider.getFile(modelPath).readAsStringSync();
|
|
|
|
var collection = AnalysisContextCollectionImpl(
|
|
resourceProvider: resourceProvider,
|
|
// includedPaths: [libPath],
|
|
includedPaths: [
|
|
'/Users/scheglov/dart/admin-portal/lib',
|
|
// '/Users/scheglov/dart/admin-portal/lib/data/models/group_model.dart',
|
|
// '/Users/scheglov/dart/admin-portal/lib/utils/formatting.dart',
|
|
// '/Users/scheglov/dart/admin-portal/lib/redux/company/company_selectors.dart',
|
|
],
|
|
byteStore: byteStore,
|
|
performanceLog: PerformanceLog(io.stdout),
|
|
drainStreams: false,
|
|
);
|
|
|
|
var analysisContext = collection.contextFor(modelPath);
|
|
for (var path in analysisContext.contextRoot.analyzedFiles()) {
|
|
if (path.endsWith('.dart')) {
|
|
analysisContext.driver.addFile(path);
|
|
}
|
|
}
|
|
|
|
// analysisContext.driver.scheduler.events.listen((event) {
|
|
// switch (event) {
|
|
// case AnalyzeFile analyzeFile:
|
|
// print('[events][analyzeFile][file: ${analyzeFile.file}]');
|
|
// case ResolvedUnitResultImpl unitResult:
|
|
// print('[events][resolvedUnit][file: ${unitResult.file}]');
|
|
// print(' [events][errors: ${unitResult.errors}]');
|
|
// default:
|
|
// print('[events][event: $event]');
|
|
// }
|
|
// });
|
|
|
|
await collection.scheduler.waitForIdle();
|
|
await pumpEventQueue();
|
|
print('\n' * 2);
|
|
print('[S] Now idle');
|
|
print('-' * 64);
|
|
|
|
{
|
|
var buffer = StringBuffer();
|
|
collection.scheduler.accumulatedPerformance.write(buffer: buffer);
|
|
print(buffer);
|
|
collection.scheduler.accumulatedPerformance = OperationPerformanceImpl(
|
|
'<scheduler>',
|
|
);
|
|
}
|
|
|
|
resourceProvider.setOverlay(
|
|
modelPath,
|
|
content: modelCode.replaceAll(
|
|
'bool get hasCurrency =>',
|
|
'bool get hasCurrency2 =>',
|
|
),
|
|
modificationStamp: 1,
|
|
);
|
|
analysisContext.changeFile(modelPath);
|
|
print('[S] hasCurrency -> hasCurrency2');
|
|
print('\n' * 2);
|
|
await collection.scheduler.waitForIdle();
|
|
await pumpEventQueue();
|
|
print('\n' * 2);
|
|
print('[S] Now idle');
|
|
print('-' * 64);
|
|
|
|
{
|
|
var buffer = StringBuffer();
|
|
collection.scheduler.accumulatedPerformance.write(buffer: buffer);
|
|
print(buffer);
|
|
collection.scheduler.accumulatedPerformance = OperationPerformanceImpl(
|
|
'<scheduler>',
|
|
);
|
|
}
|
|
|
|
resourceProvider.setOverlay(
|
|
modelPath,
|
|
content: modelCode.replaceAll(
|
|
'bool get hasCurrency2 =>',
|
|
'bool get hasCurrency =>',
|
|
),
|
|
modificationStamp: 2,
|
|
);
|
|
analysisContext.changeFile(modelPath);
|
|
print('[S] hasCurrency2 -> hasCurrency');
|
|
print('\n' * 2);
|
|
await collection.scheduler.waitForIdle();
|
|
await pumpEventQueue();
|
|
print('\n' * 2);
|
|
print('[S] Now idle');
|
|
print('-' * 64);
|
|
|
|
{
|
|
var buffer = StringBuffer();
|
|
collection.scheduler.accumulatedPerformance.write(buffer: buffer);
|
|
print(buffer);
|
|
collection.scheduler.accumulatedPerformance = OperationPerformanceImpl(
|
|
'<scheduler>',
|
|
);
|
|
}
|
|
|
|
resourceProvider.setOverlay(
|
|
modelPath,
|
|
content: modelCode.replaceAll(
|
|
'bool get hasCurrency =>',
|
|
'bool get hasCurrency2 =>',
|
|
),
|
|
modificationStamp: 3,
|
|
);
|
|
analysisContext.changeFile(modelPath);
|
|
print('[S] hasCurrency -> hasCurrency2');
|
|
print('\n' * 2);
|
|
await collection.scheduler.waitForIdle();
|
|
await pumpEventQueue();
|
|
print('\n' * 2);
|
|
print('[S] Now idle');
|
|
print('-' * 64);
|
|
|
|
{
|
|
var buffer = StringBuffer();
|
|
collection.scheduler.accumulatedPerformance.write(buffer: buffer);
|
|
print(buffer);
|
|
collection.scheduler.accumulatedPerformance = OperationPerformanceImpl(
|
|
'<scheduler>',
|
|
);
|
|
}
|
|
|
|
print('[S] Disposing...');
|
|
await collection.dispose();
|
|
}
|
|
|
|
final Stopwatch timer = Stopwatch();
|
|
|
|
Future pumpEventQueue([int times = 5000]) {
|
|
if (times == 0) return Future.value();
|
|
return Future.delayed(Duration.zero, () => pumpEventQueue(times - 1));
|
|
}
|