Skip to content

Instantly share code, notes, and snippets.

@BlackHC
Created January 14, 2017 18:15
Show Gist options
  • Save BlackHC/50737dfd7a98f7de1fea9ffd71253723 to your computer and use it in GitHub Desktop.
Save BlackHC/50737dfd7a98f7de1fea9ffd71253723 to your computer and use it in GitHub Desktop.
Determining the code type: expression or statement?
// Copyright (c) 2016, Andreas 'blackhc' Kirsch. 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:io';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/token.dart';
import 'package:analyzer/error/listener.dart';
import 'package:analyzer/src/dart/scanner/reader.dart';
import 'package:analyzer/src/dart/scanner/scanner.dart';
import 'package:analyzer/src/generated/parser.dart';
bool _tryParse(String code, Function parse) {
final reader = new CharSequenceReader(code);
final errorListener = new BooleanErrorListener();
final scanner = new Scanner(null, reader, errorListener);
final token = scanner.tokenize();
final parser = new Parser(null, errorListener);
final node = parse(parser, token) as AstNode;
return !errorListener.errorReported &&
node != null &&
node.endToken.next.type == TokenType.EOF;
}
bool isExpression(String code) => _tryParse(
code, (Parser parser, Token token) => parser.parseExpression(token));
bool isStatements(String code) => _tryParse(code, (Parser parser, Token token) {
final statements = parser.parseStatements(token);
if (statements.isEmpty) {
return null;
}
return statements.last;
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment