From ed9ad7c1b4139cfa6c28c83bd5089e3c1eccc53d Mon Sep 17 00:00:00 2001 From: Colin Kiama Date: Sun, 5 May 2024 14:08:55 +0100 Subject: [PATCH] Add Compiler Guide (#33) --- source/contributor-guide/compiler-guide.rst | 56 ++ .../01-00-project-information.rst | 20 + .../02-00-environment-setup.rst | 60 ++ .../03-00-the-vala-compiler.rst | 10 + .../03-01-vala-in-a-nutshell.rst | 57 ++ .../03-00-the-vala-compiler/03-02-parser.rst | 612 ++++++++++++++++++ .../03-03-semantic-analyzer.rst | 107 +++ .../03-04-symbol-resolution.rst | 42 ++ .../03-05-flow-analyzer.rst | 2 + .../03-06-c-code-generation.rst | 2 + .../03-07-c-code-compilation-and-linking.rst | 2 + .../assets/valac-data.png | Bin 0 -> 83919 bytes .../assets/valac-link.png | Bin 0 -> 16782 bytes .../04-00-vala-bindings-vapi.rst | 24 + .../compiler-guide/05-00-internal-libgee.rst | 6 + .../compiler-guide/06-00-other-tools.rst | 11 + .../compiler-guide/07-00-testing.rst | 6 + .../compiler-guide/08-00-documentation.rst | 16 + .../compiler-guide/09-00-build-system.rst | 44 ++ 19 files changed, 1077 insertions(+) create mode 100644 source/contributor-guide/compiler-guide.rst create mode 100644 source/contributor-guide/compiler-guide/01-00-project-information.rst create mode 100644 source/contributor-guide/compiler-guide/02-00-environment-setup.rst create mode 100644 source/contributor-guide/compiler-guide/03-00-the-vala-compiler.rst create mode 100644 source/contributor-guide/compiler-guide/03-00-the-vala-compiler/03-01-vala-in-a-nutshell.rst create mode 100644 source/contributor-guide/compiler-guide/03-00-the-vala-compiler/03-02-parser.rst create mode 100644 source/contributor-guide/compiler-guide/03-00-the-vala-compiler/03-03-semantic-analyzer.rst create mode 100644 source/contributor-guide/compiler-guide/03-00-the-vala-compiler/03-04-symbol-resolution.rst create mode 100644 source/contributor-guide/compiler-guide/03-00-the-vala-compiler/03-05-flow-analyzer.rst create mode 100644 source/contributor-guide/compiler-guide/03-00-the-vala-compiler/03-06-c-code-generation.rst create mode 100644 source/contributor-guide/compiler-guide/03-00-the-vala-compiler/03-07-c-code-compilation-and-linking.rst create mode 100644 source/contributor-guide/compiler-guide/03-00-the-vala-compiler/assets/valac-data.png create mode 100644 source/contributor-guide/compiler-guide/03-00-the-vala-compiler/assets/valac-link.png create mode 100644 source/contributor-guide/compiler-guide/04-00-vala-bindings-vapi.rst create mode 100644 source/contributor-guide/compiler-guide/05-00-internal-libgee.rst create mode 100644 source/contributor-guide/compiler-guide/06-00-other-tools.rst create mode 100644 source/contributor-guide/compiler-guide/07-00-testing.rst create mode 100644 source/contributor-guide/compiler-guide/08-00-documentation.rst create mode 100644 source/contributor-guide/compiler-guide/09-00-build-system.rst diff --git a/source/contributor-guide/compiler-guide.rst b/source/contributor-guide/compiler-guide.rst new file mode 100644 index 0000000..59d9720 --- /dev/null +++ b/source/contributor-guide/compiler-guide.rst @@ -0,0 +1,56 @@ +Compiler Guide +============== + +The goal of this document is to provide a single point of information for developers interested in improving Vala. + +It is hoped that this document will encourage more Vala users to contribute to Vala by finding/fixing bugs, writing documentation, writing test-cases, and implementing new features. + +In the opinion of this document's author, a quality Vala 1.0 is an important part of the future of the GNOME Platform, because it will simplify the task of creating and maintaining excellent language-neutral libraries, which are necessary for the next generation of applications. + +The Vala code is fresh, and easy to read. The variable and class names are descriptive, and one often has a general feel of what the code is supposed to do, so the sparse comments are generally not a problem. However, because it is a compiler, Vala is inevitably long, and its call stack deep. This document should provide a high-level view of how Vala is put together. + +This document has been ported from docbook to this wiki in order to be team-maintained and more up-to-date with latest releases of the Vala compiler. + + +License +------- + +The complete text of the GNU Free Documentation License can be found here: ``_. + +Acknowledgements +---------------- + +This document was originally created in 2008 and updated in 2010. Acknowledgements to the original authors: + +**Rodney Lorrimar** + +Document Author + +**Jürg Billeter** + +Vala Author + +**Raffaele Sandrini** + +Vala Author + +**Philip van Hoof** + +Contribution of the building Vala section. + +Edited by +~~~~~~~~~ + +Rodney Lorrimar + +Luca Bruno + +Chapters +-------- + +.. toctree:: + :glob: + :maxdepth: 1 + :numbered: + + compiler-guide/* diff --git a/source/contributor-guide/compiler-guide/01-00-project-information.rst b/source/contributor-guide/compiler-guide/01-00-project-information.rst new file mode 100644 index 0000000..89ac640 --- /dev/null +++ b/source/contributor-guide/compiler-guide/01-00-project-information.rst @@ -0,0 +1,20 @@ +Project Information +=================== + +Website, Mailing List, Bug Tracker, Matrix Room +----------------------------------------------- + +* ``_ +* GNOME GitLab issues - ``_ +* `Vala Matrix Room `_ + +Project Maintainers +------------------- +The principal authors and project maintainers are Jürg Billeter and Raffaele Sandrini. + +License +------- + +Vala compiler is licensed under LGPL 2.1, so that proprietary programs compiled with Vala can be distributed under different licenses and possibly without source code. + + diff --git a/source/contributor-guide/compiler-guide/02-00-environment-setup.rst b/source/contributor-guide/compiler-guide/02-00-environment-setup.rst new file mode 100644 index 0000000..71318d8 --- /dev/null +++ b/source/contributor-guide/compiler-guide/02-00-environment-setup.rst @@ -0,0 +1,60 @@ +Environment Setup +================= + +Compiling from the Source Repository +------------------------------------ + +The `Vala README.md `_ file contains full and up to date instructions on how to download and compile Vala from the git repository. + + +Setting up your editor +-------------------------- + +A :doc:`list of IDE(s) ` with Vala support is available. + +Vala support is available also for `build tools and editors `_. + +Files +----- + +Vala source files are named in the GTK+ style, i.e. all lowercase, with no separators between words, in the format namespaceclassname.vala. For example, the filename for Vala.FormalParameter is valaformalparameter.vala. + +For the Vala compiler and library there is only one namespace, and it is called "Vala". Don't put "using Vala;"; instead qualify the name of types you declare. For example "class Vala.FormalParameter : Symbol". + +Coding Style +------------ + +The coding style used in Vala itself seems to be a variation of the GTK+ coding style. + +* Tabs rather than spaces. +* Tab width unspecified, but 4 works well. +* Hanging braces. +* Cuddled else. +* Braces necessary for single-line blocks. +* Variable and method identifiers in lowercase, words seperated by underscores. +* Type identifiers in CamelCase. +* Enum members and constants in ALL_CAPS, words seperated by underscores. +* C-style `/* comments. */` +* Hungarian notation not used. +* Variables are often declared with implicit type (i.e. `var foo = new Foo ()`). +* No line-length limit. +* No function-length limit. +* Space between method name and parameters' opening parenthesis. +* Property `get`, `set`, `default` declaration all on one line, seperated by semicolons, if default implementations are used. +* If properties have implementations, then `get {`, `set {` open new lines. +* Attributes on their own line. +* JavaDoc-style commenting on types, methods, variables. +* Header at top of file contains: + +.. code-block:: vala + + /* filename.vala + * + * Copyright (C) 20yy-20yy Copyright Holder + * + * License text. + * + * Author: + * Programmer Name + */ + diff --git a/source/contributor-guide/compiler-guide/03-00-the-vala-compiler.rst b/source/contributor-guide/compiler-guide/03-00-the-vala-compiler.rst new file mode 100644 index 0000000..3360ced --- /dev/null +++ b/source/contributor-guide/compiler-guide/03-00-the-vala-compiler.rst @@ -0,0 +1,10 @@ +The Vala Compiler +================= + +I suppose the best place to start is valac, the tool which Vala programmers know the best. + +.. toctree:: + :glob: + :maxdepth: 1 + + 03-00-the-vala-compiler/* diff --git a/source/contributor-guide/compiler-guide/03-00-the-vala-compiler/03-01-vala-in-a-nutshell.rst b/source/contributor-guide/compiler-guide/03-00-the-vala-compiler/03-01-vala-in-a-nutshell.rst new file mode 100644 index 0000000..57528b6 --- /dev/null +++ b/source/contributor-guide/compiler-guide/03-00-the-vala-compiler/03-01-vala-in-a-nutshell.rst @@ -0,0 +1,57 @@ +Vala in a Nutshell +================== + +The Vala compiler **valac** is a small shell around libvala which handles command-line arguments, locates the sources and libraries which are required, and drives the compilation procedure. + +**How valac is linked** + +.. image:: assets/valac-link.png + :alt: How valac is linked + +All the important work such as parsing, error checking/reporting, code generation, calling **gcc**, is done in libvala. + +The code for **valac** can be found in ``compiler/valacompiler.vala``. + +Command-line Options +-------------------- + +These are handled in the normal way by the Vala binding to *GLib.OptionContext*. Most of the instance variables in Vala.Compiler are referenced in the options array. It's not very interesting. + +The Compilation Procedure and Vala.CodeContext +---------------------------------------------- + +Vala.Compiler plugs together the classes of libvala in a big pipeline. This modular design makes Vala more maintainable and external tools can easily use this code. + +The valac Pipeline +------------------ + +1. Initialize CodeContext with command-line options. +2. Add packages from command-line and others depending on the profile. +3. Add sources, Vala, Genie, Gir, VAPI, and C from command-line. +4. Parse everything. +5. Resolve symbols. +6. Run the Semantic Analyzer. +7. Run the Flow Analyzer. +8. Use the code generator to emit code. +9. Write out VAPI and GIDL files, if a library is being compiled. +10. Compile the generated C code. + +The individual steps will be explained later, but first ``Vala.CodeContext``, the data structure which holds everything together. It stores the compile options which were specified on the command line, and a list of source files to compile. There is only one ``CodeContext`` instantiated and its reference is passed around a lot, so effectively it's a global variable. + +Vala.CodeContext is the root of the code tree, because it contains the root Namespace, which holds references to all parsed code nodes. In addition to the code tree, the context contains a reference to a code generator object. This object walks the code tree and generates code. + +Vala.CodeContext contains an important method called ``accept``, which initiates a depth-first traversal of the code tree. This method, and the CodeVisitor pattern will be discussed later. + +**Data diagram** + +.. image:: assets/valac-data.png + :alt: Data diagram + +The Vala code tree is an abstract syntax tree (AST) built by parsing the Vala sources. For example, if you see a class called ``Vala.Destructor`` which inherits ``Vala.Symbol``, then it is a part of the AST. Data structures for the AST and the parser which builds it are in the ``vala`` directory. + +Vala also uses a tree to represent the C ``ccode`` that will be output. Data structures for the C code (CCode classes) tree are in the ``ccode`` directory. + +The machinery which transforms the Vala AST into a C code tree is in the ``codegen`` directory arranged in a modular visitor. The AST is traversed and a CCode tree is created. + +Vala is split upon these lines, most probably to break the system into conceptually-related, understandable chunks. However, with suitable modifications, the different modules could be replaced. Conceivably, Vala could produce non-GObject C code. More realistically, Vala could produce intermediate code as a `GCC frontend `_. + diff --git a/source/contributor-guide/compiler-guide/03-00-the-vala-compiler/03-02-parser.rst b/source/contributor-guide/compiler-guide/03-00-the-vala-compiler/03-02-parser.rst new file mode 100644 index 0000000..0945161 --- /dev/null +++ b/source/contributor-guide/compiler-guide/03-00-the-vala-compiler/03-02-parser.rst @@ -0,0 +1,612 @@ +Parser +====== + +The parser reads Vala and VAPI code and outputs an AST. In the eyes of the parser, Vala and VAPI are the same thing. The difference to us is that VAPI files never have method definitions, but the parser will read pretty much everything as long as it seems syntactically correct. Most errors are caught later by the Semantic Analyzer. + +.. note:: + + Before 0.3.1, Vala's parser was the classic flex scanner and Bison LALR parser combination. But as of `Commit eba85a `_, the parser is a hand-crafted recursive descent parser. The parser is in ``vala/valaparser.vala`` and its lexer is in ``vala/valascanner.vala``. + + +The entry point of the parser is ``Vala.Parser.parse()``. This method is called by ``Vala.Compiler.run()``. Vala.Parser is an implementation of ``Vala.CodeVisitor`` for source files. + + +Visitors and Ping Pong +----------------------- + +CodeVisitor is an abstract base class which provides 75 empty virtual methods for each kind of code node. A class which inherits CodeVisitor is supposed to do some kind of processing of the code tree. Here are all the CodeVisitor classes in Vala: + +.. code-block:: vala + + public abstract class Vala.CodeVisitor + public class Vala.CodeGenerator : CodeVisitor + public class Vala.CodeWriter : CodeVisitor + public class Vala.FlowAnalyzer : CodeVisitor + public class Vala.GenieParser : CodeVisitor + public class Vala.GirParser : CodeVisitor + public class Vala.GIdlParser : CodeVisitor + public class Vala.Parser : CodeVisitor + public class Vala.SemanticAnalyzer : CodeVisitor + public class Vala.SymbolResolver : CodeVisitor + +CodeVisitor works closely with the different ``Vala.CodeNode`` classes to traverse the code tree. Here are all the code node types in Vala grouped by superclass: + +.. code-block:: vala + + public abstract class Vala.CodeNode + + public class Vala.Attribute : CodeNode + public class Vala.CatchClause : CodeNode + public abstract class Vala.DataType : CodeNode + public abstract class Vala.Expression : CodeNode + public class Vala.MemberInitializer : CodeNode + public interface Vala.Statement : CodeNode + public class Vala.SwitchLabel : CodeNode + public abstract class Vala.Symbol : CodeNode + public class Vala.UsingDirective : CodeNode + + +Data types: + +.. code-block:: vala + + public class Vala.CType : DataType + public class Vala.DelegateType : DataType + public class Vala.FieldPrototype : DataType + public class Vala.GenericType : DataType + public class Vala.InvalidType : DataType + public class Vala.MethodType : DataType + public class Vala.PointerType : DataType + public abstract class Vala.ReferenceType : DataType + public class Vala.SignalType : DataType + public class Vala.UnresolvedType : DataType + public abstract class Vala.ValueType : DataType + public class Vala.VoidType : DataType + +Reference data types: + +.. code-block:: vala + + public class Vala.ArrayType : ReferenceType + public class Vala.ClassType : ReferenceType + public class Vala.ErrorType : ReferenceType + public class Vala.InterfaceType : ReferenceType + public class Vala.NullType : ReferenceType + public class Vala.ObjectType : ReferenceType + +Value data types: + +.. code-block:: vala + + public class Vala.BooleanType : ValueType + public class Vala.EnumValueType : ValueType + public class Vala.FloatingType : ValueType + public class Vala.IntegerType : ValueType + public class Vala.StructValueType : ValueType + +Expressions: + +.. code-block:: vala + + public class Vala.AddressofExpression : Expression + public class Vala.ArrayCreationExpression : Expression + public class Vala.Assignment : Expression + public class Vala.BaseAccess : Expression + public class Vala.BinaryExpression : Expression + public class Vala.CastExpression : Expression + public class Vala.ConditionalExpression : Expression + public class Vala.ElementAccess : Expression + public class Vala.InitializerList : Expression + public class Vala.LambdaExpression : Expression + public abstract class Vala.Literal : Expression + public class Vala.MemberAccess : Expression + public class Vala.MethodCall : Expression + public class Vala.NamedArgument : Expression + public class Vala.ObjectCreationExpression : Expression + public class Vala.PointerIndirection : Expression + public class Vala.PostfixExpression : Expression + public class Vala.ReferenceTransferExpression : Expression + public class Vala.SizeofExpression : Expression + public class Vala.SliceExpression : Expression + public class Vala.Template : Expression + public class Vala.Tuple : Expression + public class Vala.TypeCheck : Expression + public class Vala.TypeofExpression : Expression + public class Vala.UnaryExpression : Expression + +Literal expressions: + +.. code-block:: vala + + public class Vala.BooleanLiteral : Literal + public class Vala.CharacterLiteral : Literal + public class Vala.IntegerLiteral : Literal + public class Vala.ListLiteral : Literal + public class Vala.MapLiteral : Literal + public class Vala.NullLiteral : Literal + public class Vala.RealLiteral : Literal + public class Vala.RegexLiteral : Literal + public class Vala.SetLiteral : Literal + public class Vala.StringLiteral : Literal + + +Statements: + +.. code-block:: vala + + public class Vala.BreakStatement : CodeNode, Statement + public class Vala.ContinueStatement : CodeNode, Statement + public class Vala.DeclarationStatement : CodeNode, Statement + public class Vala.DeleteStatement : CodeNode, Statement + public class Vala.DoStatement : CodeNode, Statement + public class Vala.EmptyStatement : CodeNode, Statement + public class Vala.ExpressionStatement : CodeNode, Statement + public class Vala.ForStatement : CodeNode, Statement + public class Vala.IfStatement : CodeNode, Statement + public class Vala.LockStatement : CodeNode, Statement + public class Vala.Loop : CodeNode, Statement + public class Vala.ReturnStatement : CodeNode, Statement + public class Vala.StatementList : CodeNode, Statement + public class Vala.SwitchStatement : CodeNode, Statement + public class Vala.ThrowStatement : CodeNode, Statement + public class Vala.TryStatement : CodeNode, Statement + public class Vala.UnlockStatement : CodeNode, Statement + public class Vala.WhileStatement : CodeNode, Statement + public class Vala.YieldStatement : CodeNode, Statement + +Symbols: + +.. code-block:: vala + + public class Vala.Block : Symbol, Statement + public class Vala.Constructor : Symbol + public class Vala.Destructor : Symbol + public class Vala.EnumValue : Symbol + public class Vala.FormalParameter : Symbol + public class Vala.LocalVariable : Symbol + public abstract class Vala.Member : Symbol + public class Vala.Namespace : Symbol + public class Vala.PropertyAccessor : Symbol + public class Vala.TypeParameter : Symbol + public abstract class Vala.TypeSymbol : Symbol + public class Vala.UnresolvedSymbol : Symbol + +Members: + +.. code-block:: vala + + public interface Vala.Lockable + + public class Vala.Constant : Member, Lockable + public class Vala.Field : Member, Lockable + public class Vala.Method : Member + public class Vala.Property : Member, Lockable + public class Vala.Signal : Member, Lockable + +Type symbols: + +.. code-block:: vala + + public class Vala.Delegate : TypeSymbol + public class Vala.Enum : TypeSymbol + public class Vala.ErrorCode : TypeSymbol + public class Vala.ErrorDomain : TypeSymbol + public abstract class Vala.ObjectTypeSymbol : TypeSymbol + public class Vala.Struct : TypeSymbol + +Last but not least: + +.. code-block:: vala + + public class Vala.Comment + public class Vala.Scope + public class Vala.SourceFile + public class Vala.SourceReference + +The SourceFile class is an exception when visiting nodes, because it's not a CodeNode but there is a visit_source_file in the CodeVisitor. + +All CodeNodes except the root have a non-null parent CodeNode. Some specializations of CodeNode may have children. The type and number of children are declared in the specialized class. + +The two important methods in a CodeNode are *accept* and *accept_children*. The accept() method lets the node declare to the CodeVisitor what it is, so the CodeVisitor can act on it. For example, Vala.Struct.accept(): + +.. code-block:: vala + + public override void accept (CodeVisitor visitor) { + visitor.visit_struct (this); /* I am a struct! */ + } + +The accept_children() method lets the node accept all of its children so they can declare themselves to the CodeVisitor. This is the recursive part of the traversal. For example, a Struct code node has a list of base types, type parameters, fields, constants, and methods. Vala.Struct.accept_children() accepts all of these. + +.. code-block:: vala + + public override void accept_children (CodeVisitor visitor) { + if (base_type != null) { + base_type.accept (visitor); + } + + foreach (TypeParameter p in type_parameters) { + p.accept (visitor); + } + + foreach (Field f in fields) { + f.accept (visitor); + } + + foreach (Constant c in constants) { + c.accept (visitor); + } + + foreach (Method m in methods) { + m.accept (visitor); + } + + foreach (Property prop in properties) { + prop.accept (visitor); + } + } + + +As you can see, the CodeVisitor is repeatedly asked to visit different code nodes. It can do whatever analysis is necessary and then traverse deeper into the code tree. This is what a hypothetical implementation of XmlGenerator.visit_struct() might look like: + +.. code-block:: vala + + public override void visit_struct (Struct st) { + /* Do some processing of this struct. */ + stdout.printf ("\n", st.name); + + /* recurse through struct's children */ + st.accept_children (this); + + /* Do some more processing of the struct, now that its + * children have been accepted. */ + stdout.printf ("\n"); + } + +The visit\_ methods of a CodeVisitor needn't call CodeNode.accept_children(), if it isn't necessary to traverse the whole depth of the code tree. It also isn't necessary to write visit\_ methods for every kind of code node, because empty implementations are already provided in CodeVisitor. + +What does this have to do with ping pong? Well, the flow of control bounces between the CodeVisitor and the CodeNodes: accept, visit, accept, visit, ... When you navigate the code you will probably find yourself bouncing between different classes. + + +Back to the Parser +------------------ + +Vala.Parser is a highly specialized CodeVisitor - the only type of code node it visits is a Vala.SourceFile. However the Parser calls back to the context and uses it to create code nodes (mentioned before), then adds these code nodes into the context's root code node. + + +Error Handling +-------------- + +I don't want to spoil your fun too much by going into the details of the parser, other than that every parse\_ function can throw a ParseError. ParseError is caught when parsing a block or the declarations of a namespace, class, struct, or interface. Fixme. + + +Grammar of Vala +--------------- + +This grammar is hand-generated from Vala.Parser. Sometimes the structure of this grammar diverges slightly from the code, for example optional non-terminal symbols. However the non-terminal symbol names usually match a parse\_ method in Vala.Parser. + +More literal-specific grammar at https://gnome.pages.gitlab.gnome.org/vala/manual/index.html + +.. code-block:: bnf + + // parse_file + input ::= using_directive* namespace_member* + + // parse_using_directives + using_directive ::= "using" symbol [ "," symbol ]* ";" + + // parse_symbol_name + symbol ::= symbol_part [ "." symbol_part ]* + + symbol_part ::= ( "global::" identifier ) | identifier + + namespace_member ::= [ attributes ] + ( namespace_declaration | + class_declaration | + interface_declaration | + struct_declaration | + enum_declaration | + errordomain_declaration | + method_declaration | + field_declaration | + constant_declaration ) + + attributes ::= attribute* + + attribute ::= "[" identifier [ attribute_arguments ] "]" + + attribute_arguments ::= "(" attribute_argument [ "," attribute_argument ]* ")" + + attribute_argument ::= identifier "=" expression + + expression ::= lambda_expression | ( conditional_expression [ assignment_operator expression ] ) + + // get_assignment_operator plus >>= + assignment_operator ::= "=" | "+=" | "-=" | "|=" | "&=" | "^=" | "/=" | "*=" | "%=" | "<<=" | ">>=" + + conditional_expression ::= coalescing_expression [ "?" expression ":" expression ] + + coalescing_expression ::= conditional_or_expression [ "??" coalescing_expression ] + + conditional_or_expression ::= conditional_and_expression [ "||" conditional_and_expression ] + + conditional_and_expression ::= in_expression [ "&&" in_expression ] + + in_expression ::= inclusive_or_expression [ "in" inclusive_or_expression ] + + inclusive_or_expression ::= exclusive_or_expression [ "|" exclusive_or_expression ] + + exclusive_or_expression ::= and_expression [ "^" and_expression ] + + and_expression ::= equality_expression [ "&" equality_expression ] + + equality_expression ::= relational_expression [ ( "==" | "!=" ) relational_expression ]* + + relational_expression ::= shift_expression [ ( "<" | "<=" | ">" | ">=" ) shift_expression ) | + ( "is" type ) | ( "as" type ) ]* + + // parse_type + type ::= ( "void" [ "*" ]* ) | ( [ "dynamic" ] [ "unowned" ] symbol [ type_arguments ] [ "*" ]* [ "?" ] array_type* ) + + // parse_type can_weak + type_weak ::= ( "void" [ "*" ]* ) | ( [ "dynamic" ] [ "unowned" | "weak" ] symbol [ type_arguments ] [ "*" ]* [ "?" ] array_type* ) + + array_type ::= "[" array_size "]" [ "?" ] + + shift_expression ::= additive_expression [ ( "<<" | ">>" ) additive_expression ]* + + additive_expression ::= multiplicative_expression [ ( "+" | "-" ) multiplicative_expression ]* + + multiplicative_expression ::= unary_expression [ ( "*" | "/" | "%" ) unary_expression ]* + + unary_expression ::= ( unary_operator unary_expression ) | + ( "(" ( "owned" | "void" | "dynamic" | "!" | type ) ")" unary_expression ) | + primary_expression + + // get_unary_operator + unary_operator ::= "+" | "-" | "!" | "~" | "++" | "--" | "*" | "&" | "(owned)" | "(void)" | "(dynamic)" | "(!)" + + primary_expression ::= ( literal | initializer | tuple | template | open_regex_literal | this_access | base_access | + object_or_array_creation_expression | yield_expression | sizeof_expression | typeof_expression | + simple_name ) + [ member_access | pointer_member_access | method_call | element_access | + post_increment_expression | post_decrement_expression ]* + + literal ::= "true" | "false" | "null" | integer_literal | real_literal | character_literal | regex_literal | + string_literal | template_string_literal | verbatim_string_literal + + initializer ::= "{" argument [ "," argument ]* "}" + + // parse_argument_list + arguments ::= argument [ "," argument ]* + + argument ::= "ref" expression | "out" expression | expression | identifier [ ":" expression ] + + tuple ::= "(" expression [ "," expression ]* ")" + + template ::= '@"' [ expression "," ]* '"' + + // parse_regex_literal + open_regex_literal ::= "/" literal + + this_access ::= "this" + + base_access ::= "base" + + object_or_array_creation_expression ::= "new" member ( object_creation_expression | array_creation_expression ) + + object_creation_expression ::= "(" [ arguments ] ")" [ object_initializer ] + + object_initializer ::= "{" member_initializer [ "," member_initializer ] "}" + + member_initializer ::= identifier "=" expression + + array_creation_expression ::= [ "[" "]" ]* [ "[" [ array_size ] "]" ] [ initializer ] + + array_size ::= expression [ "," expression ]* + + // parse_member_name + member ::= member_part [ "." member_part ]* + + member_part ::= ( "global::" identifier || identifier ) [ type_arguments ] + + // parse_type_argument_list + type_arguments ::= "<" type [ "," type ]* ">" + + yield_expression ::= "yield" [ base_access "." ] member method_call + + method_call ::= "(" [ arguments ] ")" [ object_initializer ] + + sizeof_expression ::= "sizeof" "(" type ")" + + typeof_expression ::= "typeof" "(" type ")" + + simple_name ::= ( "global::" identifier | identifier ) [ type_arguments ] + + lambda_expression ::= lambda_expression_params "=>" lambda_expression_body + + lambda_expression_params ::= identifier | ( "(" [ identifier [ "," identifier ]* ] ")" ) + + lambda_expression_body ::= expression | block + + member_declaration_modifiers ::= member_declaration_modifier [ " " member_declaration_modifier ]* + member_declaration_modifier ::= "async" | "class" | "extern" | "inline" | "static" | "abstract" | "virtual" | "override" | "new" + + constructor_declaration ::= [ constructor_declaration_modifiers ] "construct" block + + constructor_declaration_modifiers ::= constructor_declaration_modifier [ " " constructor_declaration_modifier ]* + constructor_declaration_modifier ::= "async" | "class" | "extern" | "inline" | "static" | "abstract" | "virtual" | "override" + + destructor_declaration ::= [ constructor_declaration_modifiers ] "~" "(" ")" block + + class_declaration ::= [ access_modifier ] [ type_declaration_modifiers ] "class" symbol [ type_arguments ] + [ ":" base_types ] "{" class_member* "}" + + base_types ::= type [ "," type ]* + + class_member ::= [ attributes ] + ( class_declaration | + struct_declaration | + enum_declaration | + delegate_declaration | + method_declaration | + signal_declaration | + field_declaration | + constant_declaration | + property_declaration | + constructor_declaration | + destructor_declaration ) + + access_modifier ::= "private" "protected" "internal" "public" + + type_declaration_modifiers ::= type_declaration_modifier [ " " type_declaration_modifier ]* + type_declaration_modifier ::= "abstract" | "extern" | "static" + + enum_declaration ::= [ access_modifier ] [ type_declaration_modifiers ] "enum" symbol + "{" enumvalues [ ";" [ method_declaration | constant_declaration ]* ] "}" + + enumvalues ::= enumvalue [ "," enumvalue ]* + enumvalue ::= [ attributes ] identifier [ "=" expression ] + + errordomain_declaration ::= [ access_modifier ] [ type_declaration_modifiers ] "errordomain" symbol + "{" errorcodes [ ";" method_declaration* ] "}" + + errorcodes ::= errorcode [ "," errorcode ]* + errorcode ::= [ attributes ] identifier [ "=" expression ] + + interface_declaration ::= [ access_modifier ] [ type_declaration_modifiers ] "interface" symbol [ type_parameters ] + [ ":" base_types ] "{" interface_member* "}" + + // parse_type_parameter_list + type_parameters ::= "<" identifier [ "," identifier ]* ">" + + interface_member ::= [ attributes ] + ( class_declaration | + struct_declaration | + enum_declaration | + delegate_declaration | + method_declaration | + signal_declaration | + field_declaration | + constant_declaration | + property_declaration ) + + namespace_declaration ::= "namespace" symbol "{" using_directive* namespace_member* "}" + + struct_declaration ::= [ access_modifier ] [ type_declaration_modifiers ] "struct" symbol + [ ":" base_types ] "{" struct_member* "}" + + struct_member ::= [ attributes ] ( method_declaration | field_declaration | constant_declaration | property_declaration ) + + creation_method_declaration ::= [ access_modifier ] [ constructor_declaration_modifiers ] symbol + "(" [ parameters ] ")" [ throws ] [ requires ] [ ensures ] ( ";" | block ) + + parameters ::= parameter [ "," parameter ]* + + parameter ::= [ attributes ] ( "..." | ( [ "params" ] [ "out" | "ref" ] type identifier [ "=" expression ] ) ) + + throws ::= "throws" type [ "," type ]* + + requires ::= "requires" "(" expression ")" [ requires ] + + ensures ::= "ensures" "(" expression ")" [ ensures ] + + delegate_declaration ::= [ access_modifier ] [ delegate_declaration_modifiers ] type symbol [ type_parameters ] + "(" [ parameters ] ")" [ throws ] ";" + + delegate_declaration_modifiers ::= delegate_declaration_modifier [ " " delegate_declaration_modifier ]* + delegate_declaration_modifier ::= "async" | "class" | "extern" | "inline" | "abstract" | "virtual" | "override" + + signal_declaration ::= [ access_modifier ] [ signal_declaration_modifiers ] "signal" type identifier + "(" [ parameters ] ")" ( ";" | block ) + + signal_declaration_modifiers ::= signal_declaration_modifier [ " " signal_declaration_modifier ]* + signal_declaration_modifier ::= "async" | "extern" | "inline" | "abstract" | "virtual" | "override" | "new" + + method_declaration ::= [ access_modifier ] [ member_declaration_modifier ] type identifier [ type_parameters ] + "(" [ parameters ] ")" [ throws ] [ requires ] [ ensures ] ( ";" | block ) + + constant_declaration ::= [ access_modifier ] [ member_declaration_modifiers ] "const" type identifier [ inline_array_type ] + [ "=" expression ] ";" + + inline_array_type ::= "[" integer_literal "]" + + field_declaration ::= [ access_modifier ] [ member_declaration_modifiers ] type_weak identifier [ "=" expression ] ";" + + property_declaration ::= [ access_modifier ] [ property_declaration_modifiers ] type_weak identifier + "{" property_declaration_part* "}" + + property_declaration_part ::= ( "default" "=" expression ";" ) | property_accessor + + property_accessor ::= [ attributes ] [ access_modifier ] ( property_get_accessor | property_set_construct_accessor ) + + property_get_accessor ::= "get" ( ";" | block ) + + property_set_construct_accessor ::= ( "set" "construct" | "construct" "set" ) ( ";" | block ) + + property_declaration_modifiers ::= property_declaration_modifier [ " " property_declaration_modifier ]* + property_declaration_modifier ::= "class" | "static" | "extern" | "inline" | "abstract" | "virtual" | "override" | "new" + + block ::= "{" statement* "}" + + // parse_statements + statement ::= block | ";" | if_statement | switch_statement | while_statement | for_statement | foreach_statement | + break_statement | continue_statement | return_statement | yield_statement | throw_statement | + try_statement | lock_statement | delete_statement | local_variable_declarations | expression_statement + + if_statement ::= "if" "(" expression ")" embedded_statement [ "else" embedded_statement ] + + embedded_statement ::= block | embedded_statement_without_block + + embedded_statement_without_block ::= ";" | if_statement | switch_statement | while_statement | for_statement | + foreach_statement | break_statement | continue_statement | return_statement | + yield_statement | throw_statement | try_statement | lock_statement | delete_statement | + expression_statement + + switch_statement ::= "switch" "(" expression ")" "{" switch_section* "}" + + switch_section ::= ( "case" | "default" ) expression ":" + + while_statement ::= "while" "(" expression ")" embedded_statement + + do_statement ::= "do" embedded_statement "while" "(" expression ")" ";" + + for_statement ::= "for" "(" [ for_initializer ] ";" [ expression ] ";" [ for_iterator ] ")" embedded_statement + + for_initializer ::= local_variable_declarations | ( statement_expression [ "," statement_expression ]* ) + + for_iterator ::= statement_expression [ "," statement_expression ]* + + statement_expression ::= expression + + foreach_statement ::= "foreach" "(" ( "var" | type) identifier "in" expression ")" embedded_statement + + break_statement ::= "break" ";" + + continue_statement ::= "continue" ";" + + return_statement ::= "return" [ expression ] ";" + + yield_statement ::= "yield" [ expression_statement | "return" expression ] ";" + + throw_statement ::= "throw" expression ";" + + try_statement ::= "try" block catch_clause* [ finally_clause ] + + catch_clause ::= "catch" [ "(" type_weak identifier ")" ] block + + finally_clause ::= "finally" block + + lock_statement ::= "lock" "(" expression ")" embedded_statement + + delete_statement ::= "delete" expression ";" + + local_variable_declarations ::= ( "var" | type ) local_variable_declaration [ "," local_variable_declaration ]* + + local_variable_declartion ::= local_tuple_declaration | local_variable + + local_tuple_declaration ::= "(" identifier [ "," identifier ]* ")" "=" expression + + local_variable ::= identifier [ inline_array_type ] [ "=" expression ] + + expression_statement ::= statement_expression ";" + \ No newline at end of file diff --git a/source/contributor-guide/compiler-guide/03-00-the-vala-compiler/03-03-semantic-analyzer.rst b/source/contributor-guide/compiler-guide/03-00-the-vala-compiler/03-03-semantic-analyzer.rst new file mode 100644 index 0000000..eba70de --- /dev/null +++ b/source/contributor-guide/compiler-guide/03-00-the-vala-compiler/03-03-semantic-analyzer.rst @@ -0,0 +1,107 @@ +Semantic Analyzer +================= + +Attribute Processing +-------------------- + +Vala.Attributes are code tree nodes and have a name and a possibly empty list of key-value arguments. Some types of code tree nodes have as children a list of Attributes. The attribute processor's purpose is to interpret the attributes which were parsed into the code tree. + +Later in the compilation, the results of attribute processing will be used, for example the CCode cname attribute affects what function names are used in emitted C code. + +All attributes except for Conditional are handled from Vala.AttributeProcessor. I don't know where and how conditional is handled, but there is a function ignore_node() in Vala.CodeContext. + +Vala.AttributeProcessor is a CodeVisitor which simply calls the process_attributes() method on every namespace, class, struct, interface, enum, method, constructor, parameter, property, delegate, constant, field, and signal that it visits. + +Inside the process_attributes() method of each of these objects, a series of string comparisons will be made to parse the attributes. If the attribute is called "CCode", then the process_ccode_attributes() function will be called to parse the key-value pairs supplied. + +.. todo:: + + fixme: mention Vala.Parser.set_attributes() + +Attributes Recognized by Vala + +All Vala.Symbol (class, constant, delegate, enum, enum value, errordomain, field, interface, method, property, signal, struct): + +* Deprecated + + * since + +Vala.Namespace + +* CCode + +Vala.Class + +* CCode +* DBus +* Compact +* Immutable +* ErrorBase + +Vala.Struct + +* CCode +* SimpleType +* IntegerType +* FloatingType +* BooleanType +* Immutable + +Vala.Interface + +* CCode +* DBus + +Vala.Enum + +* CCode +* Flags + +Vala.Method + +* CCode +* DBus +* ReturnsModifiedPointer +* FloatingReference +* NoWrapper +* NoReturn +* ModuleInit + +Vala.CreationMethod + *Same as Vala.Method - this class inherits from Method* + +Vala.FormalParameter + +* CCode + +Vala.Property + +* CCode +* DBus +* NoAccessorMethod +* Description + + * nick + * blurb + +Vala.PropertyAccessor + +* CCode + +Vala.Delegate + +* CCode + +Vala.Constant + +* CCode + +Vala.Field + +* CCode + +Vala.Signal + +* DBus +* Signal +* HasEmitter diff --git a/source/contributor-guide/compiler-guide/03-00-the-vala-compiler/03-04-symbol-resolution.rst b/source/contributor-guide/compiler-guide/03-00-the-vala-compiler/03-04-symbol-resolution.rst new file mode 100644 index 0000000..c6cbb4a --- /dev/null +++ b/source/contributor-guide/compiler-guide/03-00-the-vala-compiler/03-04-symbol-resolution.rst @@ -0,0 +1,42 @@ +Symbol Resolution +================= + +Vala.SymbolResolver is a CodeVisitor that exchanges Vala.UnresolvedTypes in the parse tree with Vala.DataTypes and links Vala.NamespaceReferences with the correct namespace symbol. Additionally, it checks base types for classes so that classes don't inherit from multiple classes or themselves, and likewise it checks that interfaces don't need to implement themselves. + +Data Types +---------- + +Every expression has a static type. This is computed by the semantic analyzer. Vala.DataType is called a "type reference" because it contains a reference to a Vala.Typesymbol (a class, interface, etc) as well as information about the expression's type e.g. if it can be null, if it's an out parameter. + +.. todo + + Fixme: expand this section + + +Symbols +------- + +A Vala.Symbol is a specialization of Vala.CodeNode. All symbols except for the root symbol are contained within another's scope. Types have scope and variables have scope. For types and variables, scope determines their accessibility, subject to access modifiers. For variables, scope also determines their lifetime. As the code tree is traversed, SymbolResolver keeps track of the current scope. For example, when a class is visited, current_scope is set to that class's scope. + +When the parser parses a type, e.g. in the statement Gtk.Window main_window;, the type Gtk.Window is initially a Vala.UnresolvedType. In visit_data_type(), the UnresolvedType code node asks its parent to replace it with a new Vala.DataType created with resolve_type(). + +UnresolvedTypes have UnresolvedSymbols. resolve_type() uses resolve_symbol() to find the Typesymbol referred to, and then wraps it in a new DataType object. + +resolve_symbol() is a recursive method which looks up an unresolved symbol's name in the current scope and returns the corresponding Typesymbol. The base case is when the UnresolvedSymbol has no qualifiers, e.g. Window. The recursive case is when the symbol looks like Gtk.Window or Gtk.Orientation.HORIZONTAL. In Vala.Parser.parse_symbol_name(), the symbol is built inside-out, so Gtk.Orientation.HORIZONTAL is parsed as: + +.. code-block:: + + (UnresolvedSymbol + (UnresolvedSymbol + (UnresolvedSymbol(null, "Gtk"), + "Orientation"), + "HORIZONTAL") + + +This is inside-out because Orientation is the parent scope of HORIZONTAL, but Orientation is the child node of HORIZONTAL. + +In the base case, the symbol's name is looked up in current_scope. If the symbol is not found there, then the scope of all imported namespaces is searched. If more than one imported namespace contains the symbol, an "ambiguous reference" error will be reported. + +In the recursive case, resolve_symbol() is called on the child node to give a parent scope, in which the symbol is looked up. + +One last function of SymbolResolver is in visit_variable_declarator() - to mark a variable type reference as "nullable" if the variable's type is a class, interface, array or error (reference type). This is used later by Vala.NullChecker. diff --git a/source/contributor-guide/compiler-guide/03-00-the-vala-compiler/03-05-flow-analyzer.rst b/source/contributor-guide/compiler-guide/03-00-the-vala-compiler/03-05-flow-analyzer.rst new file mode 100644 index 0000000..6989ce0 --- /dev/null +++ b/source/contributor-guide/compiler-guide/03-00-the-vala-compiler/03-05-flow-analyzer.rst @@ -0,0 +1,2 @@ +Flow Analyzer +============= diff --git a/source/contributor-guide/compiler-guide/03-00-the-vala-compiler/03-06-c-code-generation.rst b/source/contributor-guide/compiler-guide/03-00-the-vala-compiler/03-06-c-code-generation.rst new file mode 100644 index 0000000..5527787 --- /dev/null +++ b/source/contributor-guide/compiler-guide/03-00-the-vala-compiler/03-06-c-code-generation.rst @@ -0,0 +1,2 @@ +C Code Generation +================= \ No newline at end of file diff --git a/source/contributor-guide/compiler-guide/03-00-the-vala-compiler/03-07-c-code-compilation-and-linking.rst b/source/contributor-guide/compiler-guide/03-00-the-vala-compiler/03-07-c-code-compilation-and-linking.rst new file mode 100644 index 0000000..2a6373f --- /dev/null +++ b/source/contributor-guide/compiler-guide/03-00-the-vala-compiler/03-07-c-code-compilation-and-linking.rst @@ -0,0 +1,2 @@ +C Code Compilation and Linking +============================== diff --git a/source/contributor-guide/compiler-guide/03-00-the-vala-compiler/assets/valac-data.png b/source/contributor-guide/compiler-guide/03-00-the-vala-compiler/assets/valac-data.png new file mode 100644 index 0000000000000000000000000000000000000000..effc28e65b55130a1fa3da56031fa72d777bfb51 GIT binary patch literal 83919 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%0DTY$ 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 literal 0 HcmV?d00001 diff --git a/source/contributor-guide/compiler-guide/03-00-the-vala-compiler/assets/valac-link.png b/source/contributor-guide/compiler-guide/03-00-the-vala-compiler/assets/valac-link.png new file mode 100644 index 0000000000000000000000000000000000000000..960ff53e04b566ad3e033cf2c01cc57c2516c06b GIT binary patch literal 16782 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 AdH?_b literal 0 HcmV?d00001 diff --git a/source/contributor-guide/compiler-guide/04-00-vala-bindings-vapi.rst b/source/contributor-guide/compiler-guide/04-00-vala-bindings-vapi.rst new file mode 100644 index 0000000..c5f066c --- /dev/null +++ b/source/contributor-guide/compiler-guide/04-00-vala-bindings-vapi.rst @@ -0,0 +1,24 @@ +Vala Bindings - VAPI +==================== + +The bindings are located in the vapi directories. What is described below in most cases also applies to normal .vala files, but not usually necessary to newly code written in Vala. They exist for the cases when Vala's chosen values don't fit the API. + +Bindings can be generated with the Vala introspection or GObject Introspection. + + +Vala Introspection +------------------ + +This strategy was created before the GObject Introspection. There is a process of replacing it with GObject Introspection going on. + +1. vala-gen-introspect is a program written in C (under /gobject-introspection) that will generate the .gi file from C headers. +2. vapigen using the Vala.GIDLParser (under /vapigen) will then construct a Vala tree from the .gi file. + + +GObject Introspection +--------------------- + +This will be the preferred way of generating GObject bindings at some point, deprecating the old vala introspection. + +1. Existing libraries will distribute a .gir file. +2. vapigen using the Vala.GirParser (under /vala) will then construct a Vala tree from the .gir file. diff --git a/source/contributor-guide/compiler-guide/05-00-internal-libgee.rst b/source/contributor-guide/compiler-guide/05-00-internal-libgee.rst new file mode 100644 index 0000000..90dd6ce --- /dev/null +++ b/source/contributor-guide/compiler-guide/05-00-internal-libgee.rst @@ -0,0 +1,6 @@ +libgee Internal +=============== + +.. todo:: + + What is the difference between external and internal libgee? diff --git a/source/contributor-guide/compiler-guide/06-00-other-tools.rst b/source/contributor-guide/compiler-guide/06-00-other-tools.rst new file mode 100644 index 0000000..81d4b7a --- /dev/null +++ b/source/contributor-guide/compiler-guide/06-00-other-tools.rst @@ -0,0 +1,11 @@ +Other Tools +=========== + +gen-introspect +-------------- + +vapigen +------- + +vala-gen-introspect +-------------------- \ No newline at end of file diff --git a/source/contributor-guide/compiler-guide/07-00-testing.rst b/source/contributor-guide/compiler-guide/07-00-testing.rst new file mode 100644 index 0000000..ecafa01 --- /dev/null +++ b/source/contributor-guide/compiler-guide/07-00-testing.rst @@ -0,0 +1,6 @@ +Testing +======= + +A goal for Vala 1.0 is to have every tests for every documented feature of the language. + +In order to run tests with ``make check`` you must have dbus-glib development files installed, otherwise you will get invalid test failures. diff --git a/source/contributor-guide/compiler-guide/08-00-documentation.rst b/source/contributor-guide/compiler-guide/08-00-documentation.rst new file mode 100644 index 0000000..2eb694b --- /dev/null +++ b/source/contributor-guide/compiler-guide/08-00-documentation.rst @@ -0,0 +1,16 @@ +Documentation +============= + +The sources for the Vala Reference Manual are in the doc/manual directory: ``_. You can rebuild the docs by cd'ing into doc/vala and typing ``make``. + +The source code for the comppiler guide is in ``_. HTML documentation is built by default. This document can be rebuilt by running `./build-docs` in the repository's root. + +.. todo:: + + Add Generated binding documentation + +.. todo:: + + Add libvala documentation + +``_ - The documentation repository is open to anyone who would like to make a quality contribution. diff --git a/source/contributor-guide/compiler-guide/09-00-build-system.rst b/source/contributor-guide/compiler-guide/09-00-build-system.rst new file mode 100644 index 0000000..f553ae6 --- /dev/null +++ b/source/contributor-guide/compiler-guide/09-00-build-system.rst @@ -0,0 +1,44 @@ +Build System +============ + +Vala is built using the standard GNU Autotools. The built executables are actually stored in .libs directories and wrapped by scripts. Therefore to debug, follow these instructions: + +.. todo:: + + Add Vala debug instructions. + +**./configure** uses the AC_PATH_PROG macro to choose the **valac** which is on your path, or one specified in the VALAC environment variable. Therefore, to build Vala with your own **valac**, type this, for example: + +.. code-block:: console + + VALAC=$HOME/dev/vala-x.y.z/compiler/valac ./configure --prefix=$HOME/prefix + +Out-of-tree build +----------------- + +An out-of-tree build does not properly work yet. Out-of-tree builds have the advantage that your source tree is not cluttered with built files. Suppose you have vala checked out in ~/dev/vala. + +.. code-block:: console + + rodney@solaria:~/dev % git clone https://gitlab.gnome.org/GNOME/vala.git + rodney@solaria:~/dev % ls vala + fixme fixme fixme fixme + aclocal.m4 config.log gobject-introspection README + AUTHORS config.status INSTALL stamp-h1 + autogen.sh config.sub install-sh tests + autom4te.cache configure libtool vala + ccode configure.ac ltmain.sh vala-1.0.pc + ChangeLog COPYING MAINTAINERS vala-1.0.pc.in + compile depcomp Makefile vapi + compiler doc Makefile.am vapigen + config.guess gee Makefile.in ylwrap + config.h gen-project missing + config.h.in gobject NEWS + fixme fixme fixme fixme + rodney@solaria:~/dev % mkdir buildvala + rodney@solaria:~/dev % cd buildvala + rodney@solaria:~/dev/buildvala % ../vala/autogen.sh --prefix=$HOME/dev/prefix + rodney@solaria:~/dev/buildvala % make + + +All Makefiles, etc, generated by configure will be put in the buildvala directory and you can run make directly from there.