SF.net SVN: geany: [1058] trunk

eht16 at users.sourceforge.net eht16 at xxxxx
Thu Dec 7 15:47:00 UTC 2006


Revision: 1058
          http://svn.sourceforge.net/geany/?rev=1058&view=rev
Author:   eht16
Date:     2006-12-07 07:47:00 -0800 (Thu, 07 Dec 2006)

Log Message:
-----------
Added new scintilla lexer for D. It needs testing and there is more work to do to get it working properly.

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/data/filetypes.d
    trunk/scintilla/KeyWords.cxx
    trunk/scintilla/Makefile.am
    trunk/scintilla/include/SciLexer.h
    trunk/scintilla/makefile.win32
    trunk/src/highlighting.c

Added Paths:
-----------
    trunk/scintilla/LexD.cxx

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2006-12-07 15:13:49 UTC (rev 1057)
+++ trunk/ChangeLog	2006-12-07 15:47:00 UTC (rev 1058)
@@ -2,6 +2,11 @@
 
  * src/document.c: Create new tm file object when changing the filetype
                    of a document to avoid a confused tagmanager.
+ * data/filetypes.d, scintilla/KeyWords.cxx, scintilla/LexD.cxx,
+   scintilla/Makefile.am, scintilla/makefile.win32,
+   scintilla/include/SciLexer.h, src/highlighting.c:
+   Added new scintilla lexer for D. It needs testing and there is more
+   work to do to get it working properly.
 
 
 2006-12-06  Enrico Tröger  <enrico.troeger at uvena.de>

Modified: trunk/data/filetypes.d
===================================================================
--- trunk/data/filetypes.d	2006-12-07 15:13:49 UTC (rev 1057)
+++ trunk/data/filetypes.d	2006-12-07 15:47:00 UTC (rev 1058)
@@ -5,28 +5,28 @@
 comment=0xd00000;0xffffff;false;false
 commentline=0xd00000;0xffffff;false;false
 commentdoc=0x3f5fbf;0xffffff;false;false
+commentdocnested=0x3f5fbf;0xffffff;false;false
 number=0x007f00;0xffffff;false;false
 word=0x00007f;0xffffff;true;false
 word2=0x991111;0xffffff;true;false
+word3=0x991111;0xffffff;true;false
+typedef=0x0000d0;0xffffff;false;false
 string=0xff901e;0xffffff;false;false
+stringeol=0x000000;0xe0c0e0;false;false
 character=0xff901e;0xffffff;false;false
-uuid=0x404080;0xffffff;false;false
-preprocessor=0x007F7F;0xffffff;false;false
 operator=0x301010;0xffffff;false;false
 identifier=0x000000;0xffffff;false;false
-stringeol=0x000000;0xe0c0e0;false;false
-verbatim=0x101030;0xffffff;false;false
-regex=0x105090;0xffffff;false;false
 commentlinedoc=0x3f5fbf;0xffffff;true;false
 commentdockeyword=0x3f5fbf;0xffffff;true;true
 commentdockeyworderror=0x3f5fbf;0xffffff;false;false
-globalclass=0x0000d0;0xffffff;true;false
 
 [keywords]
 # all items must be in one line
 primary=__FILE__ __LINE__ __DATA__ __TIME__ __TIMESTAMP__ abstract alias align asm assert auto body bool break byte case cast catch cdouble cent cfloat char class const continue creal dchar debug default delegate delete deprecated do double else enum export extern false final finally float for foreach function goto idouble if ifloat import in inout int interface invariant ireal is long mixin module new null out override package pragma private protected public real return scope short static struct super switch synchronized template this throw true try typedef typeof ubyte ucent uint ulong union unittest ushort version void volatile wchar while with
+secondary=
 # documentation keywords for D, currently not working
 docComment=Authors Bugs Copyright Date Deprecated Examples History License Macros Params Returns See_Also Standards Throws Version
+types=
 
 [settings]
 # the following characters are these which a "word" can contains, see documentation

Modified: trunk/scintilla/KeyWords.cxx
===================================================================
--- trunk/scintilla/KeyWords.cxx	2006-12-07 15:13:49 UTC (rev 1057)
+++ trunk/scintilla/KeyWords.cxx	2006-12-07 15:47:00 UTC (rev 1058)
@@ -166,6 +166,7 @@
 	LINK_LEXER(lmSQL);
 	LINK_LEXER(lmTCL);
 	LINK_LEXER(lmVHDL);
+	LINK_LEXER(lmD);
 
 //--Autogenerated -- end of automatically generated section
 

Added: trunk/scintilla/LexD.cxx
===================================================================
--- trunk/scintilla/LexD.cxx	                        (rev 0)
+++ trunk/scintilla/LexD.cxx	2006-12-07 15:47:00 UTC (rev 1058)
@@ -0,0 +1,369 @@
+/** @file LexD.cxx
+ ** Lexer for D.
+ **
+ ** Copyright (c) 2006 by Waldemar Augustyn <waldemar at wdmsys.com>
+ ** Licensed under the terms described in LicenseContributor.txt.
+ **/
+// Copyright 1998-2005 by Neil Hodgson <neilh at scintilla.org>
+// The License.txt file describes the conditions under which this software may be distributed.
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "Platform.h"
+
+#include "PropSet.h"
+#include "Accessor.h"
+#include "StyleContext.h"
+#include "KeyWords.h"
+#include "Scintilla.h"
+#include "SciLexer.h"
+
+/*/ Nested comments require keeping the value of the nesting level for every
+    position in the document.  But since scintilla always styles line by line,
+    we only need to store that value per line. The non-negative number indicates
+    nesting level at the end of the line.
+/*/
+
+// We use custom qualifiers since it is not clear what D allows.
+
+static bool IsWordStart(char ch) {
+	return isascii(ch) && (isalpha(ch) || ch == '_');
+}
+
+static bool IsWord(char ch) {
+	return isascii(ch) && (isalnum(ch) || ch == '_');
+}
+
+static bool IsDoxygen(char ch) {
+	if (isascii(ch) && islower(ch))
+		return true;
+	if (ch == '$' || ch == '@' || ch == '\\' || 
+		ch == '&' || ch == '#' || ch == '<' || ch == '>' ||
+		ch == '{' || ch == '}' || ch == '[' || ch == ']')
+		return true;
+	return false;
+}
+
+
+static void ColouriseDDoc(unsigned int startPos, int length, int initStyle, 
+    WordList *keywordlists[], Accessor &styler, bool caseSensitive) {
+
+    WordList &keywords = *keywordlists[0];
+    WordList &keywords2 = *keywordlists[1];
+    WordList &keywords3 = *keywordlists[2];
+    WordList &keywords4 = *keywordlists[3];
+
+    int styleBeforeDCKeyword = SCE_D_DEFAULT;
+
+    StyleContext sc(startPos, length, initStyle, styler);
+	    
+    int curLine = styler.GetLine(startPos);
+    int curNcLevel = curLine > 0? styler.GetLineState(curLine-1): 0;
+
+    //~ printf("WA LexD::Colorize start(%d)  end(%d)  initStyle(%d) curLine(%d) begNcLevel(%d)\n",
+        //~ startPos, startPos+length, initStyle, curLine+1, curNcLevel);
+
+    for (; sc.More(); sc.Forward()) {
+
+        if (sc.atLineStart) {
+            if (sc.state == SCE_D_STRING) {
+                // Prevent SCE_D_STRINGEOL from leaking back to previous line which
+                // ends with a line continuation by locking in the state upto this position.
+                sc.SetState(SCE_D_STRING);
+            }
+            curLine = styler.GetLine(sc.currentPos);
+            styler.SetLineState(curLine, curNcLevel);
+            //~ printf("    WA LexD::Colorize set line(%d) to curNcLevel(%d) BOL\n",
+                //~ curLine+1, curNcLevel);
+        }
+	
+        // Handle line continuation generically.
+        if (sc.ch == '\\') {
+            if (sc.chNext == '\n' || sc.chNext == '\r') {
+                sc.Forward();
+                if (sc.ch == '\r' && sc.chNext == '\n') {
+                    sc.Forward();
+                }
+                continue;
+            }
+        }
+
+        // Determine if the current state should terminate.
+        switch (sc.state) {
+            case SCE_D_OPERATOR:
+                sc.SetState(SCE_D_DEFAULT);
+                break;
+            case SCE_D_NUMBER:
+                // We accept almost anything because of hex. and number suffixes
+                if (!IsWord(sc.ch) && sc.ch != '.') {
+                    sc.SetState(SCE_D_DEFAULT);
+                }
+                break;
+            case SCE_D_IDENTIFIER:
+                if (!IsWord(sc.ch)) {
+                    char s[1000];
+                    if (caseSensitive) {
+                        sc.GetCurrent(s, sizeof(s));
+                    } else {
+                        sc.GetCurrentLowered(s, sizeof(s));
+                    }
+                    if (keywords.InList(s)) {
+                        sc.ChangeState(SCE_D_WORD);
+                    } else if (keywords2.InList(s)) {
+                        sc.ChangeState(SCE_D_WORD2);
+                    } else if (keywords4.InList(s)) {
+                        sc.ChangeState(SCE_D_TYPEDEF);
+                    }
+                    sc.SetState(SCE_D_DEFAULT);
+                }
+                break;
+            case SCE_D_COMMENT:
+                if (sc.Match('*', '/')) {
+                    sc.Forward();
+                    sc.ForwardSetState(SCE_D_DEFAULT);
+                }
+                break;
+            case SCE_D_COMMENTDOC:
+                if (sc.Match('*', '/')) {
+                    sc.Forward();
+                    sc.ForwardSetState(SCE_D_DEFAULT);
+                } else if (sc.ch == '@' || sc.ch == '\\') { // JavaDoc and Doxygen support
+                    // Verify that we have the conditions to mark a comment-doc-keyword
+                    if ((IsASpace(sc.chPrev) || sc.chPrev == '*') && (!IsASpace(sc.chNext))) {
+                        styleBeforeDCKeyword = SCE_D_COMMENTDOC;
+                        sc.SetState(SCE_D_COMMENTDOCKEYWORD);
+                    }
+                }
+                break;
+            case SCE_D_COMMENTLINE:
+                if (sc.atLineStart) {
+                    sc.SetState(SCE_D_DEFAULT);
+                }
+                break;
+            case SCE_D_COMMENTLINEDOC:
+                if (sc.atLineStart) {
+                    sc.SetState(SCE_D_DEFAULT);
+                } else if (sc.ch == '@' || sc.ch == '\\') { // JavaDoc and Doxygen support
+                    // Verify that we have the conditions to mark a comment-doc-keyword
+                    if ((IsASpace(sc.chPrev) || sc.chPrev == '/' || sc.chPrev == '!') && (!IsASpace(sc.chNext))) {
+                        styleBeforeDCKeyword = SCE_D_COMMENTLINEDOC;
+                        sc.SetState(SCE_D_COMMENTDOCKEYWORD);
+                    }
+                }
+                break;
+            case SCE_D_COMMENTDOCKEYWORD:
+                if ((styleBeforeDCKeyword == SCE_D_COMMENTDOC) && sc.Match('*', '/')) {
+                    sc.ChangeState(SCE_D_COMMENTDOCKEYWORDERROR);
+                    sc.Forward();
+                    sc.ForwardSetState(SCE_D_DEFAULT);
+                } else if (!IsDoxygen(sc.ch)) {
+                    char s[100];
+                    if (caseSensitive) {
+                        sc.GetCurrent(s, sizeof(s));
+                    } else {
+                        sc.GetCurrentLowered(s, sizeof(s));
+                    }
+                    if (!IsASpace(sc.ch) || !keywords3.InList(s + 1)) {
+                        sc.ChangeState(SCE_D_COMMENTDOCKEYWORDERROR);
+                    }
+                    sc.SetState(styleBeforeDCKeyword);
+                }
+                break;
+            case SCE_D_COMMENTNESTED:
+                if (sc.Match('+', '/')) {
+                    if (curNcLevel > 0)
+                        curNcLevel -= 1;
+                    curLine = styler.GetLine(sc.currentPos);
+                    styler.SetLineState(curLine, curNcLevel);
+                    //~ printf("    WA LexD::Colorize set line(%d) to curNcLevel(%d) NEST DOWN\n",
+                        //~ curLine+1, curNcLevel);
+                    sc.Forward();
+                    if (curNcLevel == 0) {
+                        sc.ForwardSetState(SCE_D_DEFAULT);
+		    }
+                }
+                else if (sc.Match('/','+')) {
+                    curNcLevel += 1;
+                    curLine = styler.GetLine(sc.currentPos);
+                    styler.SetLineState(curLine, curNcLevel);
+                    //~ printf("    WA LexD::Colorize set line(%d) to curNcLevel(%d) NEST UP\n",
+                        //~ curLine+1, curNcLevel);
+                    sc.Forward();
+                }
+                break;
+            case SCE_D_STRING:
+                if (sc.atLineEnd) {
+                    sc.ChangeState(SCE_D_STRINGEOL);
+                } else if (sc.ch == '\\') {
+                    if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') {
+                        sc.Forward();
+                    }
+                } else if (sc.ch == '\"') {
+                    sc.ForwardSetState(SCE_D_DEFAULT);
+                }
+                break;
+            case SCE_D_CHARACTER:
+                if (sc.atLineEnd) {
+                    sc.ChangeState(SCE_D_STRINGEOL);
+                } else if (sc.ch == '\\') {
+                    if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') {
+                        sc.Forward();
+                    }
+                } else if (sc.ch == '\'') {
+                    sc.ForwardSetState(SCE_D_DEFAULT);
+                }
+                break;
+            case SCE_D_STRINGEOL:
+                if (sc.atLineStart) {
+                    sc.SetState(SCE_D_DEFAULT);
+                }
+                break;
+        }
+
+        // Determine if a new state should be entered.
+        if (sc.state == SCE_D_DEFAULT) {
+            if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {
+                    sc.SetState(SCE_D_NUMBER);
+            } else if (IsWordStart(sc.ch)) {
+                    sc.SetState(SCE_D_IDENTIFIER);
+            } else if (sc.Match('/','+')) {
+                curNcLevel += 1;
+		curLine = styler.GetLine(sc.currentPos);
+                styler.SetLineState(curLine, curNcLevel);
+                //~ printf("    WA LexD::Colorize set line(%d) to curNcLevel(%d) NEST NEW\n",
+                    //~ curLine+1, curNcLevel);
+                sc.SetState(SCE_D_COMMENTNESTED);
+                sc.Forward();
+            } else if (sc.Match('/', '*')) {
+                if (sc.Match("/**") || sc.Match("/*!")) {   // Support of Qt/Doxygen doc. style
+                    sc.SetState(SCE_D_COMMENTDOC);
+                } else {
+                    sc.SetState(SCE_D_COMMENT);
+                }
+                sc.Forward();   // Eat the * so it isn't used for the end of the comment
+            } else if (sc.Match('/', '/')) {
+                if ((sc.Match("///") && !sc.Match("////")) || sc.Match("//!"))
+                    // Support of Qt/Doxygen doc. style
+                    sc.SetState(SCE_D_COMMENTLINEDOC);
+                else
+                    sc.SetState(SCE_D_COMMENTLINE);
+            } else if (sc.ch == '\"') {
+                sc.SetState(SCE_D_STRING);
+            } else if (sc.ch == '\'') {
+                sc.SetState(SCE_D_CHARACTER);
+            } else if (isoperator(static_cast<char>(sc.ch))) {
+                sc.SetState(SCE_D_OPERATOR);
+            }
+        }
+    }
+    sc.Complete();
+    //~ styler.Flush();	// Make sure nested comments are properly accounted for
+    //~ styler.ClearNestedCommentChange();
+}
+
+static bool IsStreamCommentStyle(int style) {
+    return style == SCE_D_COMMENT ||
+        style == SCE_D_COMMENTDOC ||
+        style == SCE_D_COMMENTDOCKEYWORD ||
+        style == SCE_D_COMMENTDOCKEYWORDERROR;
+}
+
+// Store both the current line's fold level and the next lines in the
+// level store to make it easy to pick up with each increment
+// and to make it possible to fiddle the current level for "} else {".
+static void FoldNoBoxDDoc(unsigned int startPos, int length, int initStyle,
+                            Accessor &styler) {
+    bool foldComment = styler.GetPropertyInt("fold.comment") != 0;
+    bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0;
+    bool foldAtElse = styler.GetPropertyInt("fold.at.else", 0) != 0;
+    unsigned int endPos = startPos + length;
+    int visibleChars = 0;
+    int lineCurrent = styler.GetLine(startPos);
+    int levelCurrent = SC_FOLDLEVELBASE;
+    if (lineCurrent > 0)
+        levelCurrent = styler.LevelAt(lineCurrent-1) >> 16;
+    int levelMinCurrent = levelCurrent;
+    int levelNext = levelCurrent;
+    char chNext = styler[startPos];
+    int styleNext = styler.StyleAt(startPos);
+    int style = initStyle;
+    for (unsigned int i = startPos; i < endPos; i++) {
+        char ch = chNext;
+        chNext = styler.SafeGetCharAt(i + 1);
+        int stylePrev = style;
+        style = styleNext;
+        styleNext = styler.StyleAt(i + 1);
+        bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
+        if (foldComment && IsStreamCommentStyle(style)) {
+            if (!IsStreamCommentStyle(stylePrev)) {
+                levelNext++;
+            } else if (!IsStreamCommentStyle(styleNext) && !atEOL) {
+                // Comments don't end at end of line and the next character may be unstyled.
+                levelNext--;
+            }
+        }
+        if (style == SCE_D_OPERATOR) {
+            if (ch == '{') {
+                // Measure the minimum before a '{' to allow
+                // folding on "} else {"
+                if (levelMinCurrent > levelNext) {
+                    levelMinCurrent = levelNext;
+                }
+                levelNext++;
+            } else if (ch == '}') {
+                levelNext--;
+            }
+        }
+        if (atEOL) {
+            if (foldComment) {	// Handle nested comments
+		int nc;
+                nc =  styler.GetLineState(lineCurrent);
+                nc -= lineCurrent>0? styler.GetLineState(lineCurrent-1): 0;
+                levelNext += nc;
+	    }
+            int levelUse = levelCurrent;
+            if (foldAtElse) {
+                levelUse = levelMinCurrent;
+            }
+            int lev = levelUse | levelNext << 16;
+            if (visibleChars == 0 && foldCompact)
+                lev |= SC_FOLDLEVELWHITEFLAG;
+            if (levelUse < levelNext)
+                lev |= SC_FOLDLEVELHEADERFLAG;
+            if (lev != styler.LevelAt(lineCurrent)) {
+                styler.SetLevel(lineCurrent, lev);
+            }
+            lineCurrent++;
+            levelCurrent = levelNext;
+            levelMinCurrent = levelCurrent;
+            visibleChars = 0;
+        }
+        if (!IsASpace(ch))
+            visibleChars++;
+    }
+}
+
+static void FoldDDoc(unsigned int startPos, int length, int initStyle, 
+    WordList *[], Accessor &styler) {
+        FoldNoBoxDDoc(startPos, length, initStyle, styler);
+}
+
+static const char * const dWordLists[] = {
+            "Primary keywords and identifiers",
+            "Secondary keywords and identifiers",
+            "Documentation comment keywords",
+            "Type definitions and aliases",
+            0,
+        };
+
+static void ColouriseDDocSensitive(unsigned int startPos, int length, 
+    int initStyle, WordList *keywordlists[], Accessor &styler) {
+        ColouriseDDoc(startPos, length, initStyle, keywordlists, styler, true);
+}
+
+LexerModule lmD(SCLEX_D, ColouriseDDocSensitive, "d", FoldDDoc, dWordLists);
+

Modified: trunk/scintilla/Makefile.am
===================================================================
--- trunk/scintilla/Makefile.am	2006-12-07 15:13:49 UTC (rev 1057)
+++ trunk/scintilla/Makefile.am	2006-12-07 15:47:00 UTC (rev 1058)
@@ -16,6 +16,7 @@
 LexConf.cxx \
 LexCrontab.cxx \
 LexCSS.cxx \
+LexD.cxx \
 LexFortran.cxx \
 LexHTML.cxx \
 LexOthers.cxx \

Modified: trunk/scintilla/include/SciLexer.h
===================================================================
--- trunk/scintilla/include/SciLexer.h	2006-12-07 15:13:49 UTC (rev 1057)
+++ trunk/scintilla/include/SciLexer.h	2006-12-07 15:47:00 UTC (rev 1058)
@@ -91,7 +91,8 @@
 #define SCLEX_INNOSETUP 76
 #define SCLEX_OPAL 77
 #define SCLEX_SPICE 78
-#define SCLEX_OMS 79
+#define SCLEX_D 79
+#define SCLEX_OMS 80
 #define SCLEX_AUTOMATIC 1000
 #define SCE_P_DEFAULT 0
 #define SCE_P_COMMENTLINE 1
@@ -129,6 +130,24 @@
 #define SCE_C_COMMENTDOCKEYWORD 17
 #define SCE_C_COMMENTDOCKEYWORDERROR 18
 #define SCE_C_GLOBALCLASS 19
+#define SCE_D_DEFAULT 0
+#define SCE_D_COMMENT 1
+#define SCE_D_COMMENTLINE 2
+#define SCE_D_COMMENTDOC 3
+#define SCE_D_COMMENTNESTED 4
+#define SCE_D_NUMBER 5
+#define SCE_D_WORD 6
+#define SCE_D_WORD2 7
+#define SCE_D_WORD3 8
+#define SCE_D_TYPEDEF 9
+#define SCE_D_STRING 10
+#define SCE_D_STRINGEOL 11
+#define SCE_D_CHARACTER 12
+#define SCE_D_OPERATOR 13
+#define SCE_D_IDENTIFIER 14
+#define SCE_D_COMMENTLINEDOC 15
+#define SCE_D_COMMENTDOCKEYWORD 16
+#define SCE_D_COMMENTDOCKEYWORDERROR 17
 #define SCE_TCL_DEFAULT 0
 #define SCE_TCL_COMMENT 1
 #define SCE_TCL_COMMENTLINE 2

Modified: trunk/scintilla/makefile.win32
===================================================================
--- trunk/scintilla/makefile.win32	2006-12-07 15:13:49 UTC (rev 1057)
+++ trunk/scintilla/makefile.win32	2006-12-07 15:47:00 UTC (rev 1058)
@@ -61,7 +61,8 @@
 #**LEXOBJS=\\\n\(\*.o \)
 LEXOBJS=\
 LexBash.o LexAsm.o LexCSS.o LexConf.o LexCPP.o LexCrontab.o LexHTML.o LexOthers.o LexPascal.o \
-LexPerl.o LexPython.o LexSQL.o LexCaml.o LexOMS.o LexTCL.o LexRuby.o LexFortran.o LexVHDL.o
+LexPerl.o LexPython.o LexSQL.o LexCaml.o LexOMS.o LexTCL.o LexRuby.o LexFortran.o LexVHDL.o \
+LexD.o
 #--Autogenerated -- end of automatically generated section
 
 all: $(COMPLIB)

Modified: trunk/src/highlighting.c
===================================================================
--- trunk/src/highlighting.c	2006-12-07 15:13:49 UTC (rev 1057)
+++ trunk/src/highlighting.c	2006-12-07 15:47:00 UTC (rev 1058)
@@ -2525,53 +2525,88 @@
 
 	load_keyfiles(config, config_home, GEANY_FILETYPES_D);
 
-	new_style_array(GEANY_FILETYPES_D, 20);
-	styleset_c_like_init(config, config_home, GEANY_FILETYPES_D);
+	new_style_array(GEANY_FILETYPES_D, 18);
 
-	style_sets[GEANY_FILETYPES_D].keywords = g_new(gchar*, 3);
-	get_keyfile_keywords(config, config_home, "keywords", "primary", GEANY_FILETYPES_D, 0, "__FILE__ __LINE__ __DATA__ __TIME__ __TIMESTAMP__ abstract alias align asm assert auto body bool break byte case cast catch cdouble cent cfloat char class const continue creal dchar debug default delegate delete deprecated do double else enum export extern false final finally float for foreach function goto idouble if ifloat import in inout int interface invariant ireal is long mixin module new null out override package pragma private protected public real return scope short static struct super switch synchronized template this throw true try typedef typeof ubyte ucent uint ulong union unittest ushort version void volatile wchar while with");
-	get_keyfile_keywords(config, config_home, "keywords", "docComment", GEANY_FILETYPES_D, 1, "TODO FIXME");
-	style_sets[GEANY_FILETYPES_D].keywords[2] = NULL;
+	get_keyfile_hex(config, config_home, "styling", "default", "0x000000", "0xffffff", "false", &style_sets[GEANY_FILETYPES_D].styling[0]);
+	get_keyfile_hex(config, config_home, "styling", "comment", "0xd00000", "0xffffff", "false", &style_sets[GEANY_FILETYPES_D].styling[1]);
+	get_keyfile_hex(config, config_home, "styling", "commentline", "0xd00000", "0xffffff", "false", &style_sets[GEANY_FILETYPES_D].styling[2]);
+	get_keyfile_hex(config, config_home, "styling", "commentdoc", "0x3f5fbf", "0xffffff", "false", &style_sets[GEANY_FILETYPES_D].styling[3]);
+	get_keyfile_hex(config, config_home, "styling", "commentdocnested", "0x3f5fbf", "0xffffff", "false", &style_sets[GEANY_FILETYPES_D].styling[4]);
+	get_keyfile_hex(config, config_home, "styling", "number", "0x007f00", "0xffffff", "false", &style_sets[GEANY_FILETYPES_D].styling[5]);
+	get_keyfile_hex(config, config_home, "styling", "word", "0x00007f", "0xffffff", "true", &style_sets[GEANY_FILETYPES_D].styling[6]);
+	get_keyfile_hex(config, config_home, "styling", "word2", "0x991111", "0xffffff", "true", &style_sets[GEANY_FILETYPES_D].styling[7]);
+	get_keyfile_hex(config, config_home, "styling", "word3", "0x991111", "0xffffff", "true", &style_sets[GEANY_FILETYPES_D].styling[8]);
+	get_keyfile_hex(config, config_home, "styling", "typedef", "0x0000d0", "0xffffff", "false", &style_sets[GEANY_FILETYPES_D].styling[9]);
+	get_keyfile_hex(config, config_home, "styling", "string", "0xff901e", "0xffffff", "false", &style_sets[GEANY_FILETYPES_D].styling[10]);
+	get_keyfile_hex(config, config_home, "styling", "stringeol", "0x000000", "0xe0c0e0", "false", &style_sets[GEANY_FILETYPES_D].styling[11]);
+	get_keyfile_hex(config, config_home, "styling", "character", "0xff901e", "0xffffff", "false", &style_sets[GEANY_FILETYPES_D].styling[12]);
+	get_keyfile_hex(config, config_home, "styling", "operator", "0x301010", "0xffffff", "false", &style_sets[GEANY_FILETYPES_D].styling[13]);
+	get_keyfile_hex(config, config_home, "styling", "identifier", "0x000000", "0xffffff", "false", &style_sets[GEANY_FILETYPES_D].styling[14]);
+	get_keyfile_hex(config, config_home, "styling", "commentlinedoc", "0x3f5fbf", "0xffffff", "true", &style_sets[GEANY_FILETYPES_D].styling[15]);
+	get_keyfile_hex(config, config_home, "styling", "commentdockeyword", "0x3f5fbf", "0xffffff", "true", &style_sets[GEANY_FILETYPES_D].styling[16]);
+	get_keyfile_hex(config, config_home, "styling", "commentdockeyworderror", "0x3f5fbf", "0xffffff", "false", &style_sets[GEANY_FILETYPES_D].styling[17]);
 
-	get_keyfile_wordchars(config, config_home,
-		&style_sets[GEANY_FILETYPES_D].wordchars);
+	style_sets[GEANY_FILETYPES_D].keywords = g_new(gchar*, 5);
+	get_keyfile_keywords(config, config_home, "keywords", "primary", GEANY_FILETYPES_D, 0,
+			"__FILE__ __LINE__ __DATA__ __TIME__ __TIMESTAMP__ abstract alias align asm assert auto \
+			 body bool break byte case cast catch cdouble cent cfloat char class const continue creal \
+			 dchar debug default delegate delete deprecated do double else enum export extern false \
+			 final finally float for foreach function goto idouble if ifloat import in inout int \
+			 interface invariant ireal is long mixin module new null out override package pragma \
+			 private protected public real return scope short static struct super switch \
+			 synchronized template this throw true try typedef typeof ubyte ucent uint ulong union \
+			 unittest ushort version void volatile wchar while with");
+	get_keyfile_keywords(config, config_home, "keywords", "secondary", GEANY_FILETYPES_D, 1,
+			"");
+	get_keyfile_keywords(config, config_home, "keywords", "docComment", GEANY_FILETYPES_D, 2,
+			"Authors Bugs Copyright Date Deprecated Examples History License Macros Params Returns \
+			 See_Also Standards Throws Version");
+	get_keyfile_keywords(config, config_home, "keywords", "types", GEANY_FILETYPES_D, 3,
+			"");
+	style_sets[GEANY_FILETYPES_D].keywords[4] = NULL;
+
+	get_keyfile_wordchars(config, config_home, &style_sets[GEANY_FILETYPES_D].wordchars);
 	filetypes_get_config(config, config_home, GEANY_FILETYPES_D);
 
 	g_key_file_free(config);
 	g_key_file_free(config_home);
-
-	// load global tags file for C autocompletion
-	// C++ is a special case, here we use 0 to have C global tags in C++, too
-	symbols_global_tags_loaded(GEANY_FILETYPES_C);
 }
 
 
 void styleset_d(ScintillaObject *sci)
 {
-	GString *s;
-
 	styleset_common(sci, 5);
 	if (style_sets[GEANY_FILETYPES_D].styling == NULL) styleset_d_init();
 
-	/* Assign global keywords */
-	s = get_global_typenames();
-	if (s != NULL)
-	{
-		SSM(sci, SCI_SETKEYWORDS, 1, (sptr_t) s->str);
-		g_string_free(s, TRUE);
-	}
-
 	SSM(sci, SCI_SETWORDCHARS, 0, (sptr_t) style_sets[GEANY_FILETYPES_D].wordchars);
 	SSM(sci, SCI_AUTOCSETMAXHEIGHT, app->autocompletion_max_height, 0);
 
-	SSM(sci, SCI_SETLEXER, SCLEX_CPP, 0);
+	SSM(sci, SCI_SETLEXER, SCLEX_D, 0);
 
-	//SSM(sci, SCI_SETCONTROLCHARSYMBOL, 32, 0);
-
 	SSM(sci, SCI_SETKEYWORDS, 0, (sptr_t) style_sets[GEANY_FILETYPES_D].keywords[0]);
-	SSM(sci, SCI_SETKEYWORDS, 2, (sptr_t) style_sets[GEANY_FILETYPES_D].keywords[1]);
+	SSM(sci, SCI_SETKEYWORDS, 1, (sptr_t) style_sets[GEANY_FILETYPES_D].keywords[1]);
+	SSM(sci, SCI_SETKEYWORDS, 2, (sptr_t) style_sets[GEANY_FILETYPES_D].keywords[2]);
+	SSM(sci, SCI_SETKEYWORDS, 3, (sptr_t) style_sets[GEANY_FILETYPES_D].keywords[3]);
 
-	styleset_c_like(sci, GEANY_FILETYPES_D);
+	set_sci_style(sci, STYLE_DEFAULT, GEANY_FILETYPES_D, 0);
+	set_sci_style(sci, SCE_D_DEFAULT, GEANY_FILETYPES_D, 0);
+	set_sci_style(sci, SCE_D_COMMENT, GEANY_FILETYPES_D, 1);
+	set_sci_style(sci, SCE_D_COMMENTLINE, GEANY_FILETYPES_D, 2);
+	set_sci_style(sci, SCE_D_COMMENTDOC, GEANY_FILETYPES_D, 3);
+	set_sci_style(sci, SCE_D_COMMENTNESTED, GEANY_FILETYPES_D, 4);
+	set_sci_style(sci, SCE_D_NUMBER, GEANY_FILETYPES_D, 5);
+	set_sci_style(sci, SCE_D_WORD, GEANY_FILETYPES_D, 6);
+	set_sci_style(sci, SCE_D_WORD2, GEANY_FILETYPES_D, 7);
+	set_sci_style(sci, SCE_D_WORD3, GEANY_FILETYPES_D, 8);
+	set_sci_style(sci, SCE_D_TYPEDEF, GEANY_FILETYPES_D, 9);
+	set_sci_style(sci, SCE_D_STRING, GEANY_FILETYPES_D, 10);
+	set_sci_style(sci, SCE_D_STRINGEOL, GEANY_FILETYPES_D, 11);
+	set_sci_style(sci, SCE_D_CHARACTER, GEANY_FILETYPES_D, 12);
+	set_sci_style(sci, SCE_D_OPERATOR, GEANY_FILETYPES_D, 13);
+	set_sci_style(sci, SCE_D_IDENTIFIER, GEANY_FILETYPES_D, 14);
+	set_sci_style(sci, SCE_D_COMMENTLINEDOC, GEANY_FILETYPES_D, 15);
+	set_sci_style(sci, SCE_D_COMMENTDOCKEYWORD, GEANY_FILETYPES_D, 16);
+	set_sci_style(sci, SCE_D_COMMENTDOCKEYWORDERROR, GEANY_FILETYPES_D, 17);
 }
 
 


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