All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.snapscript.core.link.DefaultImportReader Maven / Gradle / Ivy

package org.snapscript.core.link;

import java.util.LinkedHashSet;
import java.util.Set;

import org.snapscript.common.io.PropertyReader;
import org.snapscript.core.error.InternalStateException;

public class DefaultImportReader extends PropertyReader{
   
   private static final String WILD = "*";
   
   public DefaultImportReader(String file) {
      super(file);
   }

   @Override
   protected DefaultImport create(String name, char[] data, int off, int length, int line) {
      Set imports = createImports(data, off, length, line);
      Set modules = createModules(data, off, length, line);

      if(imports.remove(WILD)) {
         return new DefaultImport(imports, modules, name, true);
      }
      return new DefaultImport(imports, modules, name);
   }
   
   private Set createImports(char[] data, int off, int length, int line) {
      Set imports = new LinkedHashSet();
      int count = length + off - 1;
      
      for(int i = count; i >= 0; i--) {
         char next = data[i];
         
         if(delimiter(next)) {
            if(count > i) {
               String token = format(data, i+1, count-i);
               imports.add(token);
               count = i-1;
            }
         } 
         if(group(next)) {
            return imports;
         }
      }
      throw new InternalStateException("Error with imports from '" + file + "' at line " + line);
   }
   
   private Set createModules(char[] data, int off, int length, int line) {
      Set packages = new LinkedHashSet();
      int count = length + off;

      for(int i = off; i < count; i++) {
         char next = data[i];

         if(delimiter(next)) {
            if(i > off) {
               String token = format(data, off, i - off);
               packages.add(token);
               off = i + 1;
            }
         }
         if(group(next)) {
            return packages;
         }
      }
      throw new InternalStateException("Error with package from '" + file + "' at line " + line);
   }
   
   private boolean group(char value) {
      return value == '{';
   }
   
   private boolean delimiter(char value) {
      return value == ',' || value == '{';
   }
   
   @Override
   protected boolean terminal(char value) {
      return value == '}';
   }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy