package bluej.stride.framedjava.ast;

import java.io.StringReader;
import java.util.List;
import java.util.function.Consumer;

import bluej.parser.JavaParser;
import bluej.parser.ParseFailure;
import bluej.parser.lexer.JavaLexer;
import bluej.parser.lexer.JavaTokenTypes;
import bluej.parser.lexer.LocatableToken;
import bluej.stride.framedjava.convert.ConversionWarning;
import bluej.stride.framedjava.convert.JavaStrideParser;
import bluej.stride.framedjava.elements.CodeElement;
import threadchecker.OnThread;
import threadchecker.Tag;

@OnThread(Tag.FXPlatform)
public class Parser
{        
public static boolean parseableAsType(String s)
   {
      return parseableAs(s, p -> p.parseTypeSpec(true));     
      }

   
   public static boolean parseableAs(String s, Consumer<JavaParser> parse)
   {        
      JavaParser p = new JavaParser(new StringReader(s), false);
       
      try
       {
         parse.accept(p);

           
         
         LocatableToken tok = p.getTokenStream().nextToken();
         if (tok.getType() != JavaTokenTypes.EOF)
               
         return false;

           
         return true;         
         }
       
      catch (ParseFailure pf)
       {            
         return false;         
         }     
      }

   
   private static final String DUMMY_STEM = "code__dummy__gf3gen__";

   
   public static class DummyNameGenerator
{              
private int index = 0;

       
      public String generateNewDummyName()
       {
         return DUMMY_STEM + (index++);         
         }     
      }
    
   
   public static boolean isDummyName(String name)
   {
      return name.startsWith(DUMMY_STEM);     
      }

   
   public static boolean parseableAsNameDef(String s)
   {        
      
      JavaLexer lexer = new JavaLexer(new StringReader(s));
      LocatableToken t = lexer.nextToken();
      LocatableToken t2 = lexer.nextToken();
      if (t.getType() == JavaTokenTypes.IDENT && t2.getType() == JavaTokenTypes.EOF)
           
      return true;
       
      else{ return false;
         }     
      }

   
   public static boolean parseableAsExpression(String e)
   {        
      return Parser.parseAsExpression(new JavaParser(new StringReader(e), false));     
      }
    
   
   
| Tries to run the given parser by calling parseExpression. | Any ParseFailure exceptions are caught and false is returned. | If there is no exception, but after parsing we are not at EOF | then false is also returned. | true is only returned if there is no ParseFailure, and we parse | all the way to EOF | public static boolean parseAsExpression(JavaParser p) { try { p.parseExpression(); LocatableToken tok = p.getTokenStream().nextToken(); if (tok.getType() != JavaTokenTypes.EOF) return false; } catch (ParseFailure pf) { return false; } return true; } public static enum JavaContext {
| An item within a method (or similar) | STATEMENT, | An item within a class or interface body (field, method, constructor) | CLASS_MEMBER, | Top-level of file; package, imports and a declaration | TOP_LEVEL } public static class ConversionResult { private final List<CodeElement> elements; private final List<ConversionWarning> warnings; private ConversionResult(List<CodeElement> elements, List<ConversionWarning> warnings) { this.elements = elements; this.warnings = warnings; } public List getElements() { return elements; } public List getWarnings() { return warnings; } } @OnThread(Tag.FXPlatform) public static ConversionResult javaToStride(String java, JavaContext context, boolean testing) throws ParseFailure { JavaStrideParser parser; switch (context) { case CLASS_MEMBER: parser = new JavaStrideParser(java + "}", testing); parser.parseClassBody(); break; case STATEMENT: parser = new JavaStrideParser(java, testing); while (parser.getTokenStream().LA(1).getType() != JavaTokenTypes.EOF) parser.parseStatement(); } break; case TOP_LEVEL: parser = new JavaStrideParser(java, testing); parser.parseCU(); break; default: throw new UnsupportedOperationException(); } return new ConversionResult(parser.getCodeElements(), parser.getWarnings()); } }
top, use, map, class Parser

.   parseableAsType
.   parseableAs

top, use, map, class Parser . DummyNameGenerator

.   generateNewDummyName
.   isDummyName
.   parseableAsNameDef
.   parseableAsExpression
.   parseAsExpression

top, use, map, class Parser . DummyNameGenerator . ConversionResult

.   ConversionResult
.   getElements
.   getWarnings
.   javaToStride




201 neLoCode + 9 LoComm