[SCM] master: Implement: print (*(&a_struct)).<TAB>

cagney@sourceware.org cagney@sourceware.org
Sun Nov 18 02:05:00 GMT 2007


The branch, master has been updated
       via  5322772f56b85e995df7bf5b6833ea1230f2492e (commit)
       via  7b64c9967f5cd2aaf2dc62aa473f7984da6dbff6 (commit)
      from  8895957a8e291f3aa8103be5ea07a6fd44048561 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email.

- Log -----------------------------------------------------------------
commit 5322772f56b85e995df7bf5b6833ea1230f2492e
Author: Andrew Cagney <cagney@redhat.com>
Date:   Sat Nov 17 21:03:35 2007 -0500

    Implement: print (*(&a_struct)).<TAB>
    
    frysk-core/frysk/expr/ChangeLog
    2007-11-17  Andrew Cagney  <cagney@redhat.com>
    
    	* IncompleteMemberException.java (complete(ExprSymTab,List)):
    	Implement.
    
    frysk-core/frysk/value/ChangeLog
    2007-11-17  Andrew Cagney  <cagney@redhat.com>
    
    	* CompositeType.java (complete(String,List)): New.
    	* Type.java (complete(String,List)): New.

commit 7b64c9967f5cd2aaf2dc62aa473f7984da6dbff6
Author: Andrew Cagney <cagney@redhat.com>
Date:   Sat Nov 17 20:30:36 2007 -0500

    Detect more tab-completion cases in C expression parser.
    
    frysk-core/frysk/expr/ChangeLog
    2007-11-17  Andrew Cagney  <cagney@redhat.com>
    
    	* IncompleteTokenException.java (complete(ExprSymTab,List)): New.
    	* CompletionException.java (complete(ExprSymTab,List)): Abstract.
    	(getMessage()): Delete.
    	* IncompleteIdentifierException.java (getMessage()): New.
    	(complete(ExprSymTab,List)): New.
    	* IncompleteMemberException.java
    	(IncompleteMemberException(AST,AST)): Replace
    	IncompleteMemberException(AST).
    	(complete(ExprSymTab,List)): New.
    	* IncompleteScopeException.java: New.
    	* CExpr.g (postfix_expression): Recognize "foo.<TAB>", "foo-><TAB>".
    	(scope_expression): Recognize "::<tab>", and "::foo::<tab>".
    	(identifier): Delete.
    	* TestCompletion.java (testCompleteStructMember()): New.

-----------------------------------------------------------------------

Summary of changes:
 frysk-core/frysk/expr/CExpr.g                      |   63 +++++++++++---------
 frysk-core/frysk/expr/ChangeLog                    |   18 ++++++
 frysk-core/frysk/expr/CompletionException.java     |   19 +++---
 frysk-core/frysk/expr/ExpressionFactory.java       |   15 ++---
 .../frysk/expr/IncompleteIdentifierException.java  |   15 +++++
 .../frysk/expr/IncompleteMemberException.java      |   19 ++++++-
 ...xception.java => IncompleteScopeException.java} |   13 +++-
 .../frysk/expr/IncompleteTokenException.java       |    4 +
 frysk-core/frysk/expr/TestCompletion.java          |    3 +
 frysk-core/frysk/value/ChangeLog                   |    5 ++
 frysk-core/frysk/value/CompositeType.java          |   13 ++++
 frysk-core/frysk/value/Type.java                   |   10 +++-
 12 files changed, 142 insertions(+), 55 deletions(-)
 copy frysk-core/frysk/expr/{IncompleteIdentifierException.java => IncompleteScopeException.java} (90%)

First 500 lines of diff:
diff --git a/frysk-core/frysk/expr/CExpr.g b/frysk-core/frysk/expr/CExpr.g
index 58a0dbc..3ed9860 100644
--- a/frysk-core/frysk/expr/CExpr.g
+++ b/frysk-core/frysk/expr/CExpr.g
@@ -305,28 +305,30 @@ cast_expression!
     ;
   
 postfix_expression!
-    { AST astPostExpr = null; 
-    }   
-    :(   sc_expr: scope_expression
-         {  astPostExpr = #sc_expr; 
-         }
-         (      
-               DOT id_expr1:identifier
-               { astPostExpr = #(#[MEMBER, "Member"], #astPostExpr, #id_expr1); 
-               }                            
-           |   POINTERTO id_expr2:identifier
-               {  astPostExpr = #(#[MEMORY, "Memory"], #astPostExpr); 
-                  astPostExpr = #(#[MEMBER, "Member"], #astPostExpr, #id_expr2); 
-               } 
-               // FIX ME               
-           |   LSQUARE arrExpr1:expressionList RSQUARE  
+    { AST astPostExpr = null; }   
+    : (   sc_expr: scope_expression {  astPostExpr = #sc_expr; }
+         ( DOT
+             ( IDENT_TAB { throw new IncompleteMemberException(#astPostExpr,
+                                                               #IDENT_TAB); }
+             | id_expr1:IDENT { astPostExpr = #(#[MEMBER, "Member"],
+                                                #astPostExpr, #id_expr1); }
+             )
+         | POINTERTO
+            ( IDENT_TAB { throw new IncompleteMemberException(#astPostExpr,
+                                                              #IDENT_TAB); }
+            | id_expr2:IDENT { astPostExpr = #(#[MEMORY, "Memory"],
+                                               #astPostExpr); 
+                               astPostExpr = #(#[MEMBER, "Member"],
+                                               #astPostExpr, #id_expr2); }
+            )
+         | LSQUARE arrExpr1:expressionList RSQUARE  
 	       { astPostExpr = #(#[INDEX, "Index"], #astPostExpr, #arrExpr1); 
 	       }	      
-           |   LPAREN! expressionList RPAREN!  
-   	   |   PLUSPLUS  
+         | LPAREN! expressionList RPAREN!  
+   	 | PLUSPLUS  
    	       { astPostExpr = #(PLUSPLUS, #astPostExpr); 
    	       }
-   	   |   MINUSMINUS
+   	 | MINUSMINUS
    	       { astPostExpr = #(MINUSMINUS, #astPostExpr); 
    	       }
    	    )*
@@ -339,20 +341,23 @@ postfix_expression!
  * This enables auto-completion by allowing the user
  * to press TAB whenever auto-completion is required
  */
-
 scope_expression 
-    :   identifier (SCOPE identifier)*
-    |   IDENT_TAB { throw new IncompleteIdentifierException(#IDENT_TAB); }
-    |   SCOPE identifier
-    |   LPAREN! expressionList RPAREN!
-    |   constant
-    |   "this"
+    : IDENT
+        ( SCOPE
+            ( IDENT
+            | IDENT_TAB { throw new IncompleteScopeException(#IDENT_TAB); }
+            )
+        )*
+    | IDENT_TAB { throw new IncompleteIdentifierException(#IDENT_TAB); }
+    | SCOPE
+        ( IDENT
+        | IDENT_TAB { throw new IncompleteScopeException(#IDENT_TAB); }
+        )
+    | LPAREN! expressionList RPAREN!
+    | constant
+    | "this"
     ;
     
-identifier
-    :   ident:IDENT
-    ;   
-    
 primitiveType
     :   "boolean"
     |   "char"
diff --git a/frysk-core/frysk/expr/ChangeLog b/frysk-core/frysk/expr/ChangeLog
index 431c6b8..1908f5d 100644
--- a/frysk-core/frysk/expr/ChangeLog
+++ b/frysk-core/frysk/expr/ChangeLog
@@ -1,5 +1,23 @@
 2007-11-17  Andrew Cagney  <cagney@redhat.com>
 
+	* IncompleteMemberException.java (complete(ExprSymTab,List)):
+	Implement.
+	
+	* IncompleteTokenException.java (complete(ExprSymTab,List)): New.
+	* CompletionException.java (complete(ExprSymTab,List)): Abstract.
+	(getMessage()): Delete.
+	* IncompleteIdentifierException.java (getMessage()): New.
+	(complete(ExprSymTab,List)): New.
+	* IncompleteMemberException.java
+	(IncompleteMemberException(AST,AST)): Replace
+	IncompleteMemberException(AST).
+	(complete(ExprSymTab,List)): New.
+	* IncompleteScopeException.java: New.
+	* CExpr.g (postfix_expression): Recognize "foo.<TAB>", "foo-><TAB>".
+	(scope_expression): Recognize "::<tab>", and "::foo::<tab>".
+	(identifier): Delete.
+	* TestCompletion.java (testCompleteStructMember()): New.
+
 	* TestArithmetics.java (eval(String)): Use Expression.
 	* ExpressionFactory.java (parse(ExprSymTab,String)): New.
 	* Expression.java: New.
diff --git a/frysk-core/frysk/expr/CompletionException.java b/frysk-core/frysk/expr/CompletionException.java
index 56f2ede..c239f2b 100644
--- a/frysk-core/frysk/expr/CompletionException.java
+++ b/frysk-core/frysk/expr/CompletionException.java
@@ -40,27 +40,26 @@
 package frysk.expr;
 
 import antlr.collections.AST;
+import java.util.List;
 
 /** 
  * An incomplete blah.
  */
 
-public class CompletionException extends RuntimeException {
+abstract class CompletionException extends RuntimeException {
     static final long serialVersionUID = 1;
     private final AST ast;
     CompletionException(AST ast) {
 	this.ast = ast;
     }
-    public String getMessage() {
-	return ("complete <<"
-		+ getText()
-		+ ">> at "
-		+ getColumn());
-    }
+    /**
+     * Complete the value using the symbol table.
+     */
+    abstract int complete(ExprSymTab symTab, List candidates);
     /**
      * Return the incomplete string (minus the tab).
      */
-    public String getText() {
+    String getText() {
 	String text = ast.getText();
 	int tab = text.indexOf("\t");
 	if (tab < 0)
@@ -68,10 +67,10 @@ public class CompletionException extends RuntimeException {
 	return text.substring(0, tab);
     }
     // Useful?
-    public int getLine() {
+    int getLine() {
 	return ast.getLine();
     }
-    public int getColumn() {
+    int getColumn() {
 	// Antlr counts columns starting at 1.
 	return ast.getColumn() - 1;
     }
diff --git a/frysk-core/frysk/expr/ExpressionFactory.java b/frysk-core/frysk/expr/ExpressionFactory.java
index 16fb8f1..879f399 100644
--- a/frysk-core/frysk/expr/ExpressionFactory.java
+++ b/frysk-core/frysk/expr/ExpressionFactory.java
@@ -66,19 +66,14 @@ public class ExpressionFactory {
 	    throw new RuntimeException(e);
 	} catch (antlr.TokenStreamException e) {
 	    throw new RuntimeException(e);
-	} catch (IncompleteIdentifierException ident) {
-	    symTab.complete(ident.getText(), candidates);
-	    switch (candidates.size()) {
-	    case 0:
-		return -1;
-	    case 1: 
+	} catch (CompletionException e) {
+	    int newOffset = e.complete(symTab, candidates);
+	    Collections.sort(candidates);
+	    if (candidates.size() == 1) {
 		// Append a space.
 		candidates.add(0, candidates.remove(0) + " ");
-		return ident.getColumn();
-	    default:
-		Collections.sort(candidates);
-		return ident.getColumn();
 	    }
+	    return newOffset;
 	}
 	return -1; // nothing completed.
     }
diff --git a/frysk-core/frysk/expr/IncompleteIdentifierException.java b/frysk-core/frysk/expr/IncompleteIdentifierException.java
index 0d4fc82..fa8ad68 100644
--- a/frysk-core/frysk/expr/IncompleteIdentifierException.java
+++ b/frysk-core/frysk/expr/IncompleteIdentifierException.java
@@ -40,6 +40,7 @@
 package frysk.expr;
 
 import antlr.collections.AST;
+import java.util.List;
 
 /** 
  * An incomplete identifier; e.g.: foo<tab>
@@ -49,4 +50,18 @@ class IncompleteIdentifierException extends CompletionException {
     IncompleteIdentifierException(AST identifier) {
 	super(identifier);
     }
+    public String getMessage() {
+	return ("complete identifier <<"
+		+ getText()
+		+ ">> at "
+		+ getColumn()
+		);
+    }
+    int complete(ExprSymTab symTab, List candidates) {
+	symTab.complete(getText(), candidates);
+	if (candidates.size() == 0)
+	    return -1;
+	else
+	    return getColumn();
+    }
 }
diff --git a/frysk-core/frysk/expr/IncompleteMemberException.java b/frysk-core/frysk/expr/IncompleteMemberException.java
index fc093d5..adda314 100644
--- a/frysk-core/frysk/expr/IncompleteMemberException.java
+++ b/frysk-core/frysk/expr/IncompleteMemberException.java
@@ -40,13 +40,30 @@
 package frysk.expr;
 
 import antlr.collections.AST;
+import java.util.List;
 
 /** 
  * An incomplete field member; e.g.: structure.field<tab>
  */
 class IncompleteMemberException extends CompletionException {
     static final long serialVersionUID = 1;
-    IncompleteMemberException(AST member) {
+    private final AST expression;
+    IncompleteMemberException(AST expression, AST member) {
 	super(member);
+	this.expression = expression;
+    }
+    public String getMessage() {
+	return ("complete <<"
+		+ expression.toStringTree()
+		+ ">> . <<"
+		+ getText()
+		+ ">>");
+    }
+    int complete(ExprSymTab symTab, List candidates) {
+	if (new Expression(symTab, expression)
+	    .getType().complete(getText(),candidates))
+	    return getColumn();
+	else
+	    return -1;
     }
 }
diff --git a/frysk-core/frysk/expr/IncompleteIdentifierException.java b/frysk-core/frysk/expr/IncompleteScopeException.java
similarity index 90%
copy from frysk-core/frysk/expr/IncompleteIdentifierException.java
copy to frysk-core/frysk/expr/IncompleteScopeException.java
index 0d4fc82..8ee069b 100644
--- a/frysk-core/frysk/expr/IncompleteIdentifierException.java
+++ b/frysk-core/frysk/expr/IncompleteScopeException.java
@@ -40,13 +40,18 @@
 package frysk.expr;
 
 import antlr.collections.AST;
+import java.util.List;
 
 /** 
- * An incomplete identifier; e.g.: foo<tab>
+ * An incomplete blah.
  */
-class IncompleteIdentifierException extends CompletionException {
+
+class IncompleteScopeException extends CompletionException {
     static final long serialVersionUID = 1;
-    IncompleteIdentifierException(AST identifier) {
-	super(identifier);
+    IncompleteScopeException(AST ast) {
+	super(ast);
+    }
+    int complete(ExprSymTab symTab, List list) {
+	return -1;
     }
 }
diff --git a/frysk-core/frysk/expr/IncompleteTokenException.java b/frysk-core/frysk/expr/IncompleteTokenException.java
index 9c2a1cb..f5c8675 100644
--- a/frysk-core/frysk/expr/IncompleteTokenException.java
+++ b/frysk-core/frysk/expr/IncompleteTokenException.java
@@ -40,6 +40,7 @@
 package frysk.expr;
 
 import antlr.collections.AST;
+import java.util.List;
 
 /** 
  * An incomplete token; e.g.: :<tab>
@@ -49,4 +50,7 @@ class IncompleteTokenException extends CompletionException {
     IncompleteTokenException(AST token) {
 	super(token);
     }
+    int complete(ExprSymTab symTab, List candidates) {
+	return -1;
+    }
 }
diff --git a/frysk-core/frysk/expr/TestCompletion.java b/frysk-core/frysk/expr/TestCompletion.java
index 47fbf2a..872ee6c 100644
--- a/frysk-core/frysk/expr/TestCompletion.java
+++ b/frysk-core/frysk/expr/TestCompletion.java
@@ -81,4 +81,7 @@ public class TestCompletion extends TestCase {
     public void testCompletionBeforeOp() {
 	complete("b + a", 1, new String[] { "b1", "b2" }, 0);
     }
+    public void testCompleteStructMember() {
+	complete("a.", new String[] { "alpha", "beta", "epsilon", "gamma", "iota" }, 2);
+    }
 }
diff --git a/frysk-core/frysk/value/ChangeLog b/frysk-core/frysk/value/ChangeLog
index 9265646..5cbf1f0 100644
--- a/frysk-core/frysk/value/ChangeLog
+++ b/frysk-core/frysk/value/ChangeLog
@@ -1,3 +1,8 @@
+2007-11-17  Andrew Cagney  <cagney@redhat.com>
+
+	* CompositeType.java (complete(String,List)): New.
+	* Type.java (complete(String,List)): New.
+
 2007-11-15  Teresa Thomas  <tthomas@redhat.com>
 
 	* ArithmeticUnit.java (getLogicalValue): Delete 
diff --git a/frysk-core/frysk/value/CompositeType.java b/frysk-core/frysk/value/CompositeType.java
index 04c6230..2669fd4 100644
--- a/frysk-core/frysk/value/CompositeType.java
+++ b/frysk-core/frysk/value/CompositeType.java
@@ -41,6 +41,7 @@ package frysk.value;
 
 import inua.eio.ByteBuffer;
 import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -388,4 +389,16 @@ public abstract class CompositeType
 	    throw new RuntimeException("Invalid data member: " + member);
 	return mem.getValue (var1);
     }
+
+    public boolean complete(String incomplete, List candidates) {
+	int completions = 0;
+	for (Iterator i = nameToMember.keySet().iterator(); i.hasNext(); ) {
+	    String member = (String)i.next();
+	    if (member.startsWith(incomplete)) {
+		completions++;
+		candidates.add(member);
+	    }
+	}
+	return completions > 0;
+    }
 }
diff --git a/frysk-core/frysk/value/Type.java b/frysk-core/frysk/value/Type.java
index 9bea6cb..e69561a 100644
--- a/frysk-core/frysk/value/Type.java
+++ b/frysk-core/frysk/value/Type.java
@@ -41,7 +41,7 @@ package frysk.value;
 
 import inua.eio.ByteBuffer;
 import inua.eio.ByteOrder;
-
+import java.util.List;
 import java.io.PrintWriter;
 import java.io.StringWriter;
 
@@ -196,4 +196,12 @@ public abstract class Type {
     public Type pack(int bitSize, int bitOffset) {
 	throw new InvalidOperatorException(this, "pack");
     }
+
+    /**
+     * Complete the specified string; return false if nothing
+     * completed.
+     */
+    public boolean complete(String incomplete, List candidates) {
+	return false;
+    }
 }


hooks/post-receive
--
frysk system monitor/debugger



More information about the Frysk-cvs mailing list