SF.net SVN: geany:[4635] branches/geany-0.18.1

ntrel at users.sourceforge.net ntrel at xxxxx
Mon Feb 1 18:17:05 UTC 2010


Revision: 4635
          http://geany.svn.sourceforge.net/geany/?rev=4635&view=rev
Author:   ntrel
Date:     2010-02-01 18:17:05 +0000 (Mon, 01 Feb 2010)

Log Message:
-----------
Backport revisions 4406-4426:
Separate DKinds from CKinds.
Don't generate macro tags for D, Java.
Quick hack to parse contents of D extern{} and version{} blocks.
Fix creating D interface tags properly.
Parse D functions with contracts (fixes #1885480).
Parse D alias statement like typedef.
(Ignore some more D keywords).

Modified Paths:
--------------
    branches/geany-0.18.1/ChangeLog
    branches/geany-0.18.1/tagmanager/c.c

Modified: branches/geany-0.18.1/ChangeLog
===================================================================
--- branches/geany-0.18.1/ChangeLog	2010-02-01 18:00:39 UTC (rev 4634)
+++ branches/geany-0.18.1/ChangeLog	2010-02-01 18:17:05 UTC (rev 4635)
@@ -1,5 +1,18 @@
 2010-02-01  Nick Treleaven  <nick(dot)treleaven(at)btinternet(dot)com>
 
+ * tagmanager/c.c:
+   Backport revisions 4406-4426:
+   Separate DKinds from CKinds.
+   Don't generate macro tags for D, Java.
+   Quick hack to parse contents of D extern{} and version{} blocks.
+   Fix creating D interface tags properly.
+   Parse D functions with contracts (fixes #1885480).
+   Parse D alias statement like typedef.
+   (Ignore some more D keywords).
+
+
+2010-02-01  Nick Treleaven  <nick(dot)treleaven(at)btinternet(dot)com>
+
  * src/plugins.c:
    Fix GLib warning when toggling 'no plugins available' item.
 

Modified: branches/geany-0.18.1/tagmanager/c.c
===================================================================
--- branches/geany-0.18.1/tagmanager/c.c	2010-02-01 18:00:39 UTC (rev 4634)
+++ branches/geany-0.18.1/tagmanager/c.c	2010-02-01 18:17:05 UTC (rev 4635)
@@ -58,9 +58,9 @@
 typedef enum eKeywordId
 {
 	KEYWORD_NONE = -1,
-	KEYWORD_ATTRIBUTE, KEYWORD_ABSTRACT,
+	KEYWORD_ATTRIBUTE, KEYWORD_ABSTRACT, KEYWORD_ALIAS,
 	KEYWORD_BOOLEAN, KEYWORD_BYTE, KEYWORD_BAD_STATE, KEYWORD_BAD_TRANS,
-	KEYWORD_BIND, KEYWORD_BIND_VAR, KEYWORD_BIT,
+	KEYWORD_BIND, KEYWORD_BIND_VAR, KEYWORD_BIT, KEYWORD_BODY,
 	KEYWORD_CASE, KEYWORD_CATCH, KEYWORD_CHAR, KEYWORD_CLASS, KEYWORD_CONST,
 	KEYWORD_CONSTRAINT, KEYWORD_COVERAGE_BLOCK, KEYWORD_COVERAGE_DEF,
 	KEYWORD_DEFAULT, KEYWORD_DELEGATE, KEYWORD_DELETE, KEYWORD_DO,
@@ -69,7 +69,7 @@
 	KEYWORD_EXTENDS, KEYWORD_EVENT,
 	KEYWORD_FINAL, KEYWORD_FINALLY, KEYWORD_FLOAT, KEYWORD_FOR, KEYWORD_FRIEND, KEYWORD_FUNCTION,
 	KEYWORD_GET, KEYWORD_GOTO,
-	KEYWORD_IF, KEYWORD_IMPLEMENTS, KEYWORD_IMPORT, KEYWORD_INLINE, KEYWORD_INT,
+	KEYWORD_IF, KEYWORD_IMPLEMENTS, KEYWORD_IMPORT, KEYWORD_IN, KEYWORD_INLINE, KEYWORD_INT,
 	KEYWORD_INOUT, KEYWORD_INPUT, KEYWORD_INTEGER, KEYWORD_INTERFACE,
 	KEYWORD_INTERNAL,
 	KEYWORD_LOCAL, KEYWORD_LONG,
@@ -294,12 +294,38 @@
 	{ FALSE, 'x', "externvar",  "external variable declarations"},
 };
 
+/* Used to index into the DKinds table. */
+typedef enum
+{
+	DK_UNDEFINED = -1,
+	DK_CLASS, DK_ENUMERATOR, DK_FUNCTION,
+	DK_ENUMERATION, DK_INTERFACE, DK_MEMBER, DK_NAMESPACE, DK_PROTOTYPE,
+	DK_STRUCT, DK_TYPEDEF, DK_UNION, DK_VARIABLE,
+	DK_EXTERN_VARIABLE
+} dKind;
+
+static kindOption DKinds [] = {
+	{ TRUE,  'c', "class",      "classes"},
+	{ TRUE,  'e', "enumerator", "enumerators (values inside an enumeration)"},
+	{ TRUE,  'f', "function",   "function definitions"},
+	{ TRUE,  'g', "enum",       "enumeration names"},
+	{ TRUE,  'i', "interface",  "interfaces"},
+	{ TRUE,  'm', "member",     "class, struct, and union members"},
+	{ TRUE,  'n', "namespace",  "namespaces"},
+	{ FALSE, 'p', "prototype",  "function prototypes"},
+	{ TRUE,  's', "struct",     "structure names"},
+	{ TRUE,  't', "typedef",    "typedefs"},
+	{ TRUE,  'u', "union",      "union names"},
+	{ TRUE,  'v', "variable",   "variable definitions"},
+	{ FALSE, 'x', "externvar",  "external variable declarations"},
+};
+
 /* Used to index into the JavaKinds table. */
 typedef enum
 {
 	JK_UNDEFINED = -1,
 	JK_CLASS, JK_FIELD, JK_INTERFACE, JK_METHOD,
-	JK_PACKAGE, JK_ACCESS, JK_CLASS_PREFIX
+	JK_PACKAGE
 } javaKind;
 
 static kindOption JavaKinds [] = {
@@ -365,13 +391,15 @@
 	/* keyword          keyword ID                |  |  |  |  |  |  |    */
 	{ "__attribute__",  KEYWORD_ATTRIBUTE,      { 1, 1, 1, 0, 0, 0, 1 } },
 	{ "abstract",       KEYWORD_ABSTRACT,       { 0, 0, 1, 1, 0, 1, 1 } },
+	{ "alias",          KEYWORD_TYPEDEF,        { 0, 0, 0, 0, 0, 0, 1 } }, /* handle like typedef */
 	{ "bad_state",      KEYWORD_BAD_STATE,      { 0, 0, 0, 0, 1, 0, 0 } },
 	{ "bad_trans",      KEYWORD_BAD_TRANS,      { 0, 0, 0, 0, 1, 0, 0 } },
 	{ "bind",           KEYWORD_BIND,           { 0, 0, 0, 0, 1, 0, 0 } },
 	{ "bind_var",       KEYWORD_BIND_VAR,       { 0, 0, 0, 0, 1, 0, 0 } },
 	{ "bit",            KEYWORD_BIT,            { 0, 0, 0, 0, 1, 0, 0 } },
+	{ "body",           KEYWORD_BODY,           { 0, 0, 0, 0, 0, 0, 1 } },
 	{ "boolean",        KEYWORD_BOOLEAN,        { 0, 0, 0, 1, 0, 0, 0 } },
-	{ "byte",           KEYWORD_BYTE,           { 0, 0, 0, 1, 0, 0, 0 } },
+	{ "byte",           KEYWORD_BYTE,           { 0, 0, 0, 1, 0, 0, 1 } },
 	{ "case",           KEYWORD_CASE,           { 1, 1, 1, 1, 0, 1, 1 } },
 	{ "catch",          KEYWORD_CATCH,          { 0, 1, 1, 0, 0, 1, 1 } },
 	{ "char",           KEYWORD_CHAR,           { 1, 1, 1, 1, 0, 1, 1 } },
@@ -391,19 +419,21 @@
 	{ "event",          KEYWORD_EVENT,          { 0, 0, 1, 0, 1, 0, 0 } },
 	{ "explicit",       KEYWORD_EXPLICIT,       { 0, 1, 1, 0, 0, 0, 1 } },
 	{ "extends",        KEYWORD_EXTENDS,        { 0, 0, 0, 1, 1, 0, 0 } },
-	{ "extern",         KEYWORD_EXTERN,         { 1, 1, 1, 0, 1, 1, 1 } },
-	{ "final",          KEYWORD_FINAL,          { 0, 0, 0, 1, 0, 0, 0 } },
-	{ "finally",        KEYWORD_FINALLY,        { 0, 0, 0, 0, 0, 1, 0 } },
+	{ "extern",         KEYWORD_EXTERN,         { 1, 1, 1, 0, 1, 1, 0 } },
+	{ "extern",         KEYWORD_NAMESPACE,      { 0, 0, 0, 0, 0, 0, 1 } },	/* hack to ignore extern */
+	{ "final",          KEYWORD_FINAL,          { 0, 0, 0, 1, 0, 0, 1 } },
+	{ "finally",        KEYWORD_FINALLY,        { 0, 0, 0, 0, 0, 1, 1 } },
 	{ "float",          KEYWORD_FLOAT,          { 1, 1, 1, 1, 0, 1, 1 } },
 	{ "for",            KEYWORD_FOR,            { 1, 1, 1, 1, 0, 1, 1 } },
 	{ "friend",         KEYWORD_FRIEND,         { 0, 1, 0, 0, 0, 0, 0 } },
-	{ "function",       KEYWORD_FUNCTION,       { 0, 0, 0, 0, 1, 0, 0 } },
+	{ "function",       KEYWORD_FUNCTION,       { 0, 0, 0, 0, 1, 0, 1 } },
 	{ "get",            KEYWORD_GET,            { 0, 0, 0, 0, 0, 1, 0 } },
 	{ "goto",           KEYWORD_GOTO,           { 1, 1, 1, 1, 0, 1, 1 } },
 	{ "if",             KEYWORD_IF,             { 1, 1, 1, 1, 0, 1, 1 } },
 	{ "implements",     KEYWORD_IMPLEMENTS,     { 0, 0, 0, 1, 0, 0, 0 } },
 	{ "import",         KEYWORD_IMPORT,         { 0, 0, 0, 1, 0, 0, 1 } },
 	{ "inline",         KEYWORD_INLINE,         { 0, 1, 0, 0, 0, 1, 0 } },
+	{ "in",             KEYWORD_IN,             { 0, 0, 0, 0, 0, 0, 1 } },
 	{ "inout",          KEYWORD_INOUT,          { 0, 0, 0, 0, 1, 0, 1 } },
 	{ "input",          KEYWORD_INPUT,          { 0, 0, 0, 0, 1, 0, 0 } },
 	{ "int",            KEYWORD_INT,            { 1, 1, 1, 1, 0, 1, 1 } },
@@ -418,12 +448,12 @@
 	{ "m_trans",        KEYWORD_M_TRANS,        { 0, 0, 0, 0, 1, 0, 0 } },
 	{ "mutable",        KEYWORD_MUTABLE,        { 0, 1, 0, 0, 0, 0, 0 } },
 	{ "module",         KEYWORD_MODULE,         { 0, 0, 0, 0, 0, 0, 1 } },
-	{ "namespace",      KEYWORD_NAMESPACE,      { 0, 1, 1, 0, 0, 1, 1 } },
+	{ "namespace",      KEYWORD_NAMESPACE,      { 0, 1, 1, 0, 0, 1, 0 } },
 	{ "native",         KEYWORD_NATIVE,         { 0, 0, 0, 1, 0, 0, 0 } },
 	{ "new",            KEYWORD_NEW,            { 0, 1, 1, 1, 0, 1, 1 } },
 	{ "newcov",         KEYWORD_NEWCOV,         { 0, 0, 0, 0, 1, 0, 0 } },
 	{ "operator",       KEYWORD_OPERATOR,       { 0, 1, 1, 0, 0, 0, 0 } },
-	{ "out",            KEYWORD_OUT,            { 0, 0, 0, 0, 0, 1, 0 } },
+	{ "out",            KEYWORD_OUT,            { 0, 0, 0, 0, 0, 1, 1 } },
 	{ "output",         KEYWORD_OUTPUT,         { 0, 0, 0, 0, 1, 0, 0 } },
 	{ "overload",       KEYWORD_OVERLOAD,       { 0, 1, 0, 0, 0, 0, 0 } },
 	{ "override",       KEYWORD_OVERRIDE,       { 0, 0, 1, 0, 0, 1, 1 } },
@@ -434,7 +464,7 @@
 	{ "program",        KEYWORD_PROGRAM,        { 0, 0, 0, 0, 1, 0, 0 } },
 	{ "protected",      KEYWORD_PROTECTED,      { 0, 1, 1, 1, 1, 1, 1 } },
 	{ "public",         KEYWORD_PUBLIC,         { 0, 1, 1, 1, 1, 1, 1 } },
-	{ "ref",            KEYWORD_REF,            { 0, 0, 0, 0, 0, 1, 0 } },
+	{ "ref",            KEYWORD_REF,            { 0, 0, 0, 0, 0, 1, 1 } },
 	{ "register",       KEYWORD_REGISTER,       { 1, 1, 0, 0, 0, 0, 0 } },
 	{ "return",         KEYWORD_RETURN,         { 1, 1, 1, 1, 0, 1, 1 } },
 	{ "set",            KEYWORD_SET,            { 0, 0, 0, 0, 0, 1, 0 } },
@@ -466,6 +496,7 @@
 	{ "unsigned",       KEYWORD_UNSIGNED,       { 1, 1, 1, 0, 0, 0, 1 } },
 	{ "ushort",         KEYWORD_USHORT,         { 0, 0, 1, 0, 0, 1, 1 } },
 	{ "using",          KEYWORD_USING,          { 0, 1, 1, 0, 0, 1, 0 } },
+	{ "version",        KEYWORD_NAMESPACE,      { 0, 0, 0, 0, 0, 0, 1 } },	/* hack to ignore version */
 	{ "virtual",        KEYWORD_VIRTUAL,        { 0, 1, 1, 0, 1, 1, 0 } },
 	{ "void",           KEYWORD_VOID,           { 1, 1, 1, 1, 1, 1, 1 } },
 	{ "volatile",       KEYWORD_VOLATILE,       { 1, 1, 1, 1, 0, 0, 1 } },
@@ -547,7 +578,15 @@
 
 extern boolean includingDefineTags (void)
 {
-	return CKinds [CK_DEFINE].enabled;
+	if (isLanguage(Lang_c) ||
+		isLanguage(Lang_cpp) ||
+		isLanguage(Lang_csharp) ||
+		isLanguage(Lang_ferite) ||
+		isLanguage(Lang_glsl) ||
+		isLanguage(Lang_vala))
+		return CKinds [CK_DEFINE].enabled;
+
+	return FALSE;
 }
 
 /*
@@ -999,6 +1038,30 @@
 	return result;
 }
 
+static dKind dTagKind (const tagType type)
+{
+	dKind result = DK_UNDEFINED;
+	switch (type)
+	{
+		case TAG_CLASS:      result = DK_CLASS;           break;
+		case TAG_ENUM:       result = DK_ENUMERATION;     break;
+		case TAG_ENUMERATOR: result = DK_ENUMERATOR;      break;
+		case TAG_FUNCTION:   result = DK_FUNCTION;        break;
+		case TAG_INTERFACE:  result = DK_INTERFACE;       break;
+		case TAG_MEMBER:     result = DK_MEMBER;          break;
+		case TAG_NAMESPACE:  result = DK_NAMESPACE;       break;
+		case TAG_PROTOTYPE:  result = DK_PROTOTYPE;       break;
+		case TAG_STRUCT:     result = DK_STRUCT;          break;
+		case TAG_TYPEDEF:    result = DK_TYPEDEF;         break;
+		case TAG_UNION:      result = DK_UNION;           break;
+		case TAG_VARIABLE:   result = DK_VARIABLE;        break;
+		case TAG_EXTERN_VAR: result = DK_EXTERN_VARIABLE; break;
+
+		default: Assert ("Bad D tag type" == NULL); break;
+	}
+	return result;
+}
+
 static valaKind valaTagKind (const tagType type)
 {
 	valaKind result = VK_UNDEFINED;
@@ -1044,6 +1107,8 @@
 		result = JavaKinds [javaTagKind (type)].name;
 	else if (isLanguage (Lang_csharp))
 		result = CsharpKinds [csharpTagKind (type)].name;
+	else if (isLanguage (Lang_d))
+		result = DKinds [dTagKind (type)].name;
 	else if (isLanguage (Lang_vala))
 		result = ValaKinds [valaTagKind (type)].name;
 	else
@@ -1056,6 +1121,8 @@
 	int result;
 	if (isLanguage (Lang_csharp))
 		result = CsharpKinds [csharpTagKind (type)].letter;
+	else if (isLanguage (Lang_d))
+		result = DKinds [dTagKind (type)].letter;
 	else if (isLanguage (Lang_java))
 		result = JavaKinds [javaTagKind (type)].letter;
 	else if (isLanguage (Lang_vala))
@@ -1489,6 +1556,7 @@
 			else if (st->scope == SCOPE_GLOBAL  ||  st->scope == SCOPE_STATIC)
 				makeTag (nameToken, st, TRUE, TAG_MEMBER);
 		}
+		else if (isLanguage (Lang_java) || isLanguage (Lang_csharp) || isLanguage (Lang_vala));
 		else
 		{
 			if (st->scope == SCOPE_EXTERN  ||  ! st->haveQualifyingName)
@@ -2112,6 +2180,18 @@
 				if (isident1 (c))
 				{
 					readIdentifier (token, c);
+					if (isLanguage(Lang_d))
+					{	/* parse D contracts */
+						switch (token->keyword)
+						{
+							case KEYWORD_IN:
+							case KEYWORD_OUT:
+							case KEYWORD_BODY:
+								token->keyword = KEYWORD_CONST;
+							default:
+								break;
+						}
+					}
 					switch (token->keyword)
 					{
 					case KEYWORD_ATTRIBUTE:	skipParens ();	break;
@@ -3052,8 +3132,8 @@
 {
 	static const char *const extensions [] = { "d", "di", NULL };
 	parserDefinition* def = parserNew ("D");
-	def->kinds      = CKinds;
-	def->kindCount  = KIND_COUNT (CKinds);
+	def->kinds      = DKinds;
+	def->kindCount  = KIND_COUNT (DKinds);
 	def->extensions = extensions;
 	def->parser2    = findCTags;
 	def->initialize = initializeDParser;


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.



More information about the Commits mailing list