Kaydet (Commit) 1bed458a authored tarafından Colomban Wendling's avatar Colomban Wendling

Merge pull request #270 from b4n/zephir-filetype

Zephir filetype
......@@ -69,7 +69,8 @@ filetypes = \
filetypes.verilog \
filetypes.vhdl \
filetypes.xml \
filetypes.yaml
filetypes.yaml \
filetypes.zephir
tagfiles = \
c99.tags \
......
......@@ -67,6 +67,7 @@ Verilog=*.v;
VHDL=*.vhd;*.vhdl;
XML=*.xml;*.sgml;*.xsl;*.xslt;*.xsd;*.xhtml;*.xul;*.dtd;*.xtpl;
YAML=*.yaml;*.yml;
Zephir=*.zep;
None=*;
# Note: restarting is required after editing groups
......
# For complete documentation of this file, please see Geany's main documentation
[styling=HTML]
[keywords=HTML]
# all items must be in one line
# these are Zephir instructions, overriding PHP list
php=abstract bool break case catch class const continue default empty else false fetch finally fixed float for foreach function if int integer interface isset let long namespace new null private protected public return static string switch this throw true try typeof uint ulong unlikely var void while
[lexer_properties=PHP]
[settings=PHP]
# default extension used when saving files
extension=zep
[indentation]
#width=4
# 0 is spaces, 1 is tabs, 2 is tab & spaces
#type=1
[build_settings]
# %f will be replaced by the complete filename
# %e will be replaced by the filename without extension
# (use only one of it at one time)
compiler=zephir build
......@@ -112,7 +112,7 @@ index 41d5d54..70ce3bc 100644
LINK_LEXER(lmPascal);
- LINK_LEXER(lmPB);
LINK_LEXER(lmPerl);
- LINK_LEXER(lmPHPSCRIPT);
LINK_LEXER(lmPHPSCRIPT);
- LINK_LEXER(lmPLM);
LINK_LEXER(lmPO);
- LINK_LEXER(lmPOV);
......
......@@ -107,6 +107,7 @@ int Scintilla_LinkLexers() {
LINK_LEXER(lmOctave);
LINK_LEXER(lmPascal);
LINK_LEXER(lmPerl);
LINK_LEXER(lmPHPSCRIPT);
LINK_LEXER(lmPO);
LINK_LEXER(lmPowerShell);
LINK_LEXER(lmProps);
......
......@@ -1261,6 +1261,7 @@ static gboolean lexer_has_braces(ScintillaObject *sci)
case SCLEX_CPP:
case SCLEX_D:
case SCLEX_HTML: /* for PHP & JS */
case SCLEX_PHPSCRIPT:
case SCLEX_PASCAL: /* for multiline comments? */
case SCLEX_BASH:
case SCLEX_PERL:
......@@ -2871,6 +2872,7 @@ static gint get_multiline_comment_style(GeanyEditor *editor, gint line_start)
{
case SCLEX_XML:
case SCLEX_HTML:
case SCLEX_PHPSCRIPT:
{
if (is_style_php(sci_get_style_at(editor->sci, line_start)))
style_comment = SCE_HPHP_COMMENT;
......@@ -3408,6 +3410,7 @@ static gboolean in_block_comment(gint lexer, gint style)
style == SCE_D_COMMENTNESTED);
case SCLEX_HTML:
case SCLEX_PHPSCRIPT:
return (style == SCE_HPHP_COMMENT);
case SCLEX_CSS:
......@@ -4956,6 +4959,7 @@ void editor_set_indentation_guides(GeanyEditor *editor)
/* C-like (structured) languages benefit from the "look both" method */
case SCLEX_CPP:
case SCLEX_HTML:
case SCLEX_PHPSCRIPT:
case SCLEX_XML:
case SCLEX_PERL:
case SCLEX_LATEX:
......
......@@ -192,6 +192,7 @@ static void init_builtin_filetypes(void)
FT_INIT( RUST, RUST, "Rust", NULL, SOURCE_FILE, COMPILED );
FT_INIT( COFFEESCRIPT, NONE, "CoffeeScript", NULL, SOURCE_FILE, SCRIPT );
FT_INIT( GO, GO, "Go", NULL, SOURCE_FILE, COMPILED );
FT_INIT( ZEPHIR, ZEPHIR, "Zephir", NULL, SOURCE_FILE, COMPILED );
}
......
......@@ -102,6 +102,7 @@ typedef enum
GEANY_FILETYPES_RUST,
GEANY_FILETYPES_COFFEESCRIPT,
GEANY_FILETYPES_GO,
GEANY_FILETYPES_ZEPHIR,
/* ^ append items here */
GEANY_MAX_BUILT_IN_FILETYPES /* Don't use this, use filetypes_array->len instead */
}
......
......@@ -1046,6 +1046,7 @@ void highlighting_init_styles(guint filetype_idx, GKeyFile *config, GKeyFile *co
init_styleset_case(VERILOG);
init_styleset_case(XML);
init_styleset_case(YAML);
init_styleset_case(ZEPHIR);
default:
if (ft->lexer_filetype)
geany_debug("Filetype %s has a recursive lexer_filetype %s set!",
......@@ -1131,6 +1132,7 @@ void highlighting_set_styles(ScintillaObject *sci, GeanyFiletype *ft)
styleset_case(VERILOG);
styleset_case(XML);
styleset_case(YAML);
styleset_case(ZEPHIR);
case GEANY_FILETYPES_NONE:
default:
styleset_default(sci, ft->id);
......@@ -1490,6 +1492,7 @@ gboolean highlighting_is_string_style(gint lexer, gint style)
case SCLEX_XML:
case SCLEX_HTML:
case SCLEX_PHPSCRIPT:
return (
style == SCE_HBA_STRING ||
style == SCE_HBA_STRINGEOL ||
......@@ -1674,6 +1677,7 @@ gboolean highlighting_is_comment_style(gint lexer, gint style)
case SCLEX_XML:
case SCLEX_HTML:
case SCLEX_PHPSCRIPT:
return (
style == SCE_HBA_COMMENTLINE ||
style == SCE_HB_COMMENTLINE ||
......
......@@ -1611,6 +1611,13 @@ static const HLKeyword highlighting_keywords_YAML[] =
};
#define highlighting_properties_YAML EMPTY_PROPERTIES
/* Zephir */
#define highlighting_lexer_ZEPHIR SCLEX_PHPSCRIPT
#define highlighting_styles_ZEPHIR highlighting_styles_PHP
#define highlighting_keywords_ZEPHIR highlighting_keywords_PHP
#define highlighting_properties_ZEPHIR highlighting_properties_PHP
G_END_DECLS
#endif /* GEANY_HIGHLIGHTING_MAPPINGS_H */
......@@ -302,6 +302,7 @@ const gchar *symbols_get_context_separator(gint ft_id)
/*case GEANY_FILETYPES_RUBY:*/ /* not sure what to use atm*/
case GEANY_FILETYPES_PHP:
case GEANY_FILETYPES_RUST:
case GEANY_FILETYPES_ZEPHIR:
return "::";
/* avoid confusion with other possible separators in group/section name */
......@@ -724,6 +725,7 @@ static void add_top_level_items(GeanyDocument *doc)
break;
}
case GEANY_FILETYPES_PHP:
case GEANY_FILETYPES_ZEPHIR:
{
tag_list_add_groups(tag_store,
&(tv_iters.tag_namespace), _("Namespaces"), "classviewer-namespace",
......
......@@ -64,7 +64,8 @@
AbaqusParser, \
RustParser, \
GoParser, \
JsonParser
JsonParser, \
ZephirParser
#endif /* _PARSERS_H */
......
......@@ -227,6 +227,7 @@ typedef struct {
} tokenInfo;
static langType Lang_php;
static langType Lang_zephir;
static boolean InPhp = FALSE; /* whether we are between <? ?> */
......@@ -240,14 +241,14 @@ static struct {
static vString *CurrentNamesapce;
static void buildPhpKeywordHash (void)
static void buildPhpKeywordHash (const langType language)
{
const size_t count = sizeof (PhpKeywordTable) / sizeof (PhpKeywordTable[0]);
size_t i;
for (i = 0; i < count ; i++)
{
const keywordDesc* const p = &PhpKeywordTable[i];
addKeyword (p->name, Lang_php, (int) p->id);
addKeyword (p->name, language, (int) p->id);
}
}
......@@ -974,7 +975,7 @@ getNextChar:
else
{
parseIdentifier (token->string, c);
token->keyword = analyzeToken (token->string, Lang_php);
token->keyword = analyzeToken (token->string, getSourceLanguage ());
if (token->keyword == KEYWORD_NONE)
token->type = TOKEN_IDENTIFIER;
else
......@@ -1180,6 +1181,17 @@ static boolean parseFunction (tokenInfo *const token, const tokenInfo *name)
readToken (token); /* normally it's an open brace or "use" keyword */
}
/* if parsing Zephir, skip function return type hint */
if (getSourceLanguage () == Lang_zephir && token->type == TOKEN_OPERATOR)
{
do
readToken (token);
while (token->type != TOKEN_EOF &&
token->type != TOKEN_OPEN_CURLY &&
token->type != TOKEN_CLOSE_CURLY &&
token->type != TOKEN_SEMICOLON);
}
/* skip use(...) */
if (token->type == TOKEN_KEYWORD && token->keyword == KEYWORD_use)
{
......@@ -1435,11 +1447,10 @@ static void enterScope (tokenInfo *const parentToken,
deleteToken (token);
}
static void findPhpTags (void)
static void findTags (void)
{
tokenInfo *const token = newToken ();
InPhp = FALSE;
CurrentStatement.access = ACCESS_UNDEFINED;
CurrentStatement.impl = IMPL_UNDEFINED;
CurrentNamesapce = vStringNew ();
......@@ -1454,10 +1465,28 @@ static void findPhpTags (void)
deleteToken (token);
}
static void initialize (const langType language)
static void findPhpTags (void)
{
InPhp = FALSE;
findTags ();
}
static void findZephirTags (void)
{
InPhp = TRUE;
findTags ();
}
static void initializePhpParser (const langType language)
{
Lang_php = language;
buildPhpKeywordHash ();
buildPhpKeywordHash (language);
}
static void initializeZephirParser (const langType language)
{
Lang_zephir = language;
buildPhpKeywordHash (language);
}
extern parserDefinition* PhpParser (void)
......@@ -1468,7 +1497,19 @@ extern parserDefinition* PhpParser (void)
def->kindCount = KIND_COUNT (PhpKinds);
def->extensions = extensions;
def->parser = findPhpTags;
def->initialize = initialize;
def->initialize = initializePhpParser;
return def;
}
extern parserDefinition* ZephirParser (void)
{
static const char *const extensions [] = { "zep", NULL };
parserDefinition* def = parserNew ("Zephir");
def->kinds = PhpKinds;
def->kindCount = KIND_COUNT (PhpKinds);
def->extensions = extensions;
def->parser = findZephirTags;
def->initialize = initializeZephirParser;
return def;
}
......
......@@ -71,6 +71,7 @@ typedef enum
TM_PARSER_RUST,
TM_PARSER_GO,
TM_PARSER_JSON,
TM_PARSER_ZEPHIR,
TM_PARSER_COUNT
} TMParserType;
......
......@@ -237,6 +237,7 @@ test_sources = \
recursive.f95 \
refcurs.sql \
regexp.js \
return-hint.zep \
rules.t2t \
sample.t2t \
secondary_fcn_name.js \
......@@ -258,6 +259,7 @@ test_sources = \
simple.rb \
simple.sh \
simple.tcl \
simple.zep \
size_t_wchar_t_alias.d \
size_t_wchar_t_typedef.c \
spurious_label_tags.c \
......
class Test
{
public function first(string str) -> string
{
function nested() {
}
}
public function second(int i) -> int
{
}
}
# format=tagmanager
Test10
first16(string str)Test0
nested16()Test::first0
second16(int i)Test0
/* from http://zephir-lang.com/language.html */
namespace Test;
class MyClass
{
public function someMethod1()
{
int a = 1, b = 2;
return a + b;
}
public function someMethod2()
{
int a = 3, b = 4;
return a + b;
}
}
# format=tagmanager
MyClass1Test0
Test2560
someMethod116()Test::MyClass0
someMethod216()Test::MyClass0
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment