Skip to content

Commit

Permalink
Refactor logger and enable/disable log trace
Browse files Browse the repository at this point in the history
  • Loading branch information
clementgarbay committed Nov 29, 2017
1 parent 90d55db commit b9432e0
Show file tree
Hide file tree
Showing 12 changed files with 92 additions and 36 deletions.
10 changes: 9 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,4 +76,12 @@ let f = (\x -> x) in (app (app (\a b -> b) (app f True)) (app f 1))
1 => IntLiteral
```
```

## REPL

### Commandes

- Pour quitter `:q`
- Pour afficher l'aide `:h`
- Pour activer/désactiver les informations des étapes d'inférence et d'unification `:log`
2 changes: 1 addition & 1 deletion src/main/java/fr/imt/inference/ConstraintCollection.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
*/
public class ConstraintCollection implements Substituable<ConstraintCollection> {

private final Logger logger = new Logger();
private final Logger logger = Logger.instance;

private Deque<Constraint> constraints = new LinkedList<>();

Expand Down
2 changes: 1 addition & 1 deletion src/main/java/fr/imt/inference/Environment.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

public class Environment implements FreeTypeVariableContainer {

private Logger logger = new Logger();
private Logger logger = Logger.instance;
private Map<Expression, Scheme> env;

public Environment() {
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/fr/imt/inference/ExpressionInferer.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

public class ExpressionInferer implements Inferable<Expression, Type> {

private Logger logger = new Logger();
private Logger logger = Logger.instance;

@Override
public Either<String, Type> infer(Expression expression) {
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/fr/imt/inference/Unifiyer.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

public class Unifiyer {

private Logger logger = new Logger();
private Logger logger = Logger.instance;

public SubstitutionCollection runSolve(ConstraintCollection constraints) throws InfiniteTypeException, UnificationMismatchException, UnificationFailureException {
return solve(new SubstitutionCollection(), constraints);
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/fr/imt/inference/ast/Application.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public class Application implements Expression {
public final Expression body;
public final Expression argument;

private final Logger logger = new Logger();
private final Logger logger = Logger.instance;

public Application(
Expression body,
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/fr/imt/inference/ast/Lambda.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public class Lambda implements Expression {
public final Variable identifier;
public final Expression body;

private Logger logger = new Logger();
private Logger logger = Logger.instance;

public Lambda(Variable identifier, Expression body) {
this.identifier = identifier;
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/fr/imt/inference/ast/Let.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ public class Let implements Expression {
public final Expression definition;
public final Expression body;

private final Logger logger = new Logger();
private final Logger logger = Logger.instance;

public Let(Variable identifier, Expression definition, Expression body) {
this.identifier = identifier;
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/fr/imt/inference/type/Type.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
* - type variable
*/
public interface Type extends Substituable<Type>, FreeTypeVariableContainer {
Logger logger = new Logger();
Logger logger = Logger.instance;

boolean isTypeVariable();

Expand Down
30 changes: 27 additions & 3 deletions src/main/java/fr/imt/logger/Color.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,34 @@

public class Color {

private static final String ANSI_RESET = "\u001B[0m";
private static final String ANSI_RED = "\u001B[31m";
public static final String ANSI_RESET = "\u001B[0m";
public static final String ANSI_BLACK = "\u001B[30m";
public static final String ANSI_RED = "\u001B[31m";
public static final String ANSI_GREEN = "\u001B[32m";
public static final String ANSI_YELLOW = "\u001B[33m";
public static final String ANSI_BLUE = "\u001B[34m";
public static final String ANSI_PURPLE = "\u001B[35m";
public static final String ANSI_CYAN = "\u001B[36m";
public static final String ANSI_WHITE = "\u001B[37m";
public static final String ANSI_BLACK_BOLD_BRIGHT = "\033[1;90m";

private static String format(String color, String message) {
return String.format("%s%s%s", color, message, ANSI_RESET);
}

public static String red(String message) {
return String.format("%s%s%s", ANSI_RED, message, ANSI_RESET);
return format(ANSI_RED, message);
}

public static String grey(String message) {
return format(ANSI_BLACK_BOLD_BRIGHT, message);
}

public static String green(String message) {
return format(ANSI_GREEN, message);
}

public static String purple(String message) {
return format(ANSI_PURPLE, message);
}
}
31 changes: 16 additions & 15 deletions src/main/java/fr/imt/logger/Logger.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,14 @@

public class Logger {

private static final String ANSI_RESET = "\u001B[0m";
private static final String ANSI_BLACK = "\u001B[30m";
private static final String ANSI_RED = "\u001B[31m";
private static final String ANSI_GREEN = "\u001B[32m";
private static final String ANSI_YELLOW = "\u001B[33m";
private static final String ANSI_BLUE = "\u001B[34m";
private static final String ANSI_PURPLE = "\u001B[35m";
private static final String ANSI_CYAN = "\u001B[36m";
private static final String ANSI_WHITE = "\u001B[37m";

private static final String ANSI_BLACK_BOLD_BRIGHT = "\033[1;90m";
public static final Logger instance = new Logger();

private StringBuilder log = new StringBuilder();
private String className;

public Logger() {
private Logger() {
this.className = this.prettyClassName(new Exception().getStackTrace()[1].getClassName());
this.log = new StringBuilder();
}

private String prettyClassName(String className) {
Expand All @@ -41,15 +33,24 @@ private String prettyClassName(String className) {
private void printMessage(String level, String color, String message) {
String spaces = List.range(0, 28 - this.className.length()).map(e -> " ").mkString("");

System.out.println(String.format("%s%5s%s %s[%s]%s %s %s", color, level, ANSI_RESET, ANSI_BLACK_BOLD_BRIGHT, this.className, ANSI_RESET, spaces, message));
log.append(String.format("%s%5s%s %s[%s]%s %s %s \n", color, level, Color.ANSI_RESET, Color.ANSI_BLACK_BOLD_BRIGHT, this.className, Color.ANSI_RESET, spaces, message));
}

public void debug(String msg) {
this.printMessage("DEBUG", ANSI_GREEN, msg);
this.printMessage("DEBUG", Color.ANSI_GREEN, msg);
}

public void trace(String msg) {
this.printMessage("TRACE", ANSI_BLUE, msg);
this.printMessage("TRACE", Color.ANSI_BLUE, msg);
}

public void reset() {
this.log = new StringBuilder();
}

@Override
public String toString() {
return log.toString();
}

private class ClassNameElement {
Expand Down
41 changes: 32 additions & 9 deletions src/main/java/fr/imt/parser/Repl.java
Original file line number Diff line number Diff line change
@@ -1,43 +1,66 @@
package fr.imt.parser;

import fr.imt.logger.Color;
import fr.imt.logger.Logger;

import java.util.Scanner;

public class Repl<T> {

private final Parsable<T> parser;
private final ReplProcessable<T> processor;
private boolean showLog;

public Repl(Parsable<T> parser, ReplProcessable<T> processor) {
this.parser = parser;
this.processor = processor;
this.showLog = true;
}

public void run() {
Scanner scanner = new Scanner(System.in);

System.out.println("Hindley Milner Type System");
showHelp();

while (true) {
System.out.print("> ");
String line = scanner.nextLine().trim();

// TODO: implement a set of commands
// TODO: refactor by creating a command handler service
if (line.equals(":q")) {
break;
} else if (line.equals(":log")) {
this.showLog = !this.showLog;
System.out.println(Color.grey("Log " + (this.showLog ? "enabled" : "disabled")));
} else if (line.equals(":h")) {
showHelp();
} else {
process(line);
}
}

String res = parser.parse(line)
.fold(
parseError -> Color.red("Parsing error : " + parseError),
processor::process
);
System.out.println(Color.grey("Bye!"));
}

System.out.println(res);
}
private void process(String line) {
String result = parser.parse(line)
.fold(
parseError -> Color.red("Parsing error : " + parseError),
processor::process
);

if (this.showLog) System.out.print(Logger.instance);

System.out.println(Color.purple(result));
}

System.out.println("Bye!");
private void showHelp() {
System.out.println("\nCommands:");
System.out.println("\t\t- " + Color.green(":log") + "\t: enable/disable logs");
System.out.println("\t\t- " + Color.green(":h") + "\t: help");
System.out.println("\t\t- " + Color.green(":q") + "\t: quit");
System.out.println();
}

}

0 comments on commit b9432e0

Please sign in to comment.