This file is indexed.

/usr/share/help/de/programming-guidelines/introspection.page is in gnome-devel-docs 3.28.0-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
<?xml version="1.0" encoding="utf-8"?>
<page xmlns="http://projectmallard.org/1.0/" xmlns:its="http://www.w3.org/2005/11/its" type="topic" id="introspection" xml:lang="de">

  <info>
    <link type="guide" xref="index#specific-how-tos"/>

    <credit type="author copyright">
      <name>Philip Withnall</name>
      <email its:translate="no">philip.withnall@collabora.co.uk</email>
      <years>2015</years>
    </credit>

    <include xmlns="http://www.w3.org/2001/XInclude" href="cc-by-sa-3-0.xml"/>

    <desc>GObject Introspection support in library code</desc>
  
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
      <mal:name>Mario Blättermann</mal:name>
      <mal:email>mario.blaettermann@gmail.com</mal:email>
      <mal:years>2016</mal:years>
    </mal:credit>
  
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
      <mal:name>Christian Kirbach</mal:name>
      <mal:email>christian.kirbach@gmail.com</mal:email>
      <mal:years>2016</mal:years>
    </mal:credit>
  </info>

  <title>Introspection</title>

  <synopsis>
    <title>Zusammenfassung</title>

    <p>
      <link href="https://wiki.gnome.org/Projects/GObjectIntrospection"> GObject
      introspection</link> (abbreviated ‘GIR’) is a system which extracts APIs
      from C code and produces binary type libraries which can be used by non-C
      language bindings, and other tools, to
      <link href="http://en.wikipedia.org/wiki/Type_introspection">introspect</link>
      or <link href="http://en.wikipedia.org/wiki/Language_binding">wrap</link>
      the original C libraries. It uses a system of annotations in documentation
      comments in the C code to expose extra information about the APIs which is
      not machine readable from the code itself.
    </p>

    <p>
      It should be enabled for all public APIs: so all libraries. It cannot be
      enabled for programs, since they expose no APIs. However, it is still
      recommended to <link xref="documentation#introspection-annotations">add
      introspection annotations to documentation comments</link> in program
      code, as they clarify the documentation.
    </p>

    <list>
      <item><p>
        Enable introspection for all libraries.
        (<link xref="#using-introspection"/>)
      </p></item>
      <item><p>
        Pay attention to warnings from <cmd>g-ir-scanner</cmd> and
        <code>introspectable="0"</code> attributes in GIR files.
        (<link xref="#using-introspection"/>)
      </p></item>
      <item><p>
        Add introspection annotations to all documentation comments.
        (<link xref="#using-introspection"/>)
      </p></item>
      <item><p>
        Design APIs to be introspectable from the start.
        (<link xref="#api-design"/>)
      </p></item>
    </list>
  </synopsis>

  <section id="using-introspection">
    <title>Using Introspection</title>

    <p>
      The first step for using introspection is to add it to the build system,
      following the instructions
      <link href="https://wiki.gnome.org/Projects/GObjectIntrospection/AutotoolsIntegration#Method_1_-_Recommended_-_most_portable">here</link>,
      following method 1. This should be done early in the life of a project, as
      introspectability affects <link xref="#api-design">API design</link>.
    </p>

    <p>
      This should result in a <file>.gir</file> and <file>.typelib</file> file
      being generated for the project. The <file>.gir</file> file is human
      readable, and can be inspected manually to see if the API has been
      introspected correctly (although the GIR compilation process will print
      error messages and warnings for any missing annotations or other
      problems). APIs with <code>introspectable="0"</code> will not be exposed
      to language bindings as they are missing annotations or are otherwise not
      representable in the GIR file.
    </p>

    <p>
      The next step is to
      <link xref="documentation#introspection-annotations">add annotations to
      the documentation comments for every piece of public API</link>. If a
      particular piece of API should not be exposed in the GIR file, use the
      <code>(skip)</code> annotation. Documentation on the available annotations
      is
      <link href="https://wiki.gnome.org/Projects/GObjectIntrospection/Annotations">here</link>.
    </p>

    <p>
      If annotating the code for a program, a good approach is to split the bulk
      of the code out into an internal, private convenience library. An internal
      API reference manual can be built from its documentation comments (see
      <link xref="documentation"/>). The library is then not installed, but is
      linked in to the program which is itself installed. This approach for
      generating internal API documentation is especially useful for large
      projects where the internal code may be large and hard to navigate.
    </p>

    <p>
      Annotations do not have to be added exhaustively: GIR has a set of default
      annotations which it applies based on various conventions (see
      <link xref="#api-design"/>). For example, a <code>const gchar*</code>
      parameter does not need an explicit <code>(transfer none)</code>
      annotation, because the <code>const</code> modifier implies this already.
      Learning the defaults for annotations is a matter of practice.
    </p>
  </section>

  <section id="api-design">
    <title>API-Design</title>

    <p>
      In order to be introspectable without too many annotations, APIs must
      follow certain conventions, such as the
      <link href="https://developer.gnome.org/gobject/stable/gtype-conventions.html">standard
      GObject naming conventions</link>, and the
      <link href="https://wiki.gnome.org/Projects/GObjectIntrospection/WritingBindingableAPIs">conventions
      for bindable APIs</link>. This is necessary because of the flexibility of
      C: code can be written to behave in any way imaginable, but higher level
      languages don’t allow this kind of freedom. So in order for a C API to be
      representable in a higher level language, it has to conform to the
      behaviors supported by that language.
    </p>

    <p>
      For example, GIR expects that if a function can fail, it will have a
      <code>GError**</code> parameter, which will always be its final parameter.
      The GIR scanner detects this and automatically converts that parameter to
      an exception attribute on the method in the GIR file. It cannot do this if
      the <code>GError*</code> is returned directly, or is not the final
      function parameter, for example.
    </p>

    <p>
      Therefore, APIs must be designed to be introspectable, and the GIR file
      should be checked as the APIs are being written. If the GIR doesn’t match
      what you expect for a new API, the API may need extra annotations, or even
      for its C declaration to be changed (as in the case of
      <link href="https://wiki.gnome.org/Projects/GObjectIntrospection/WritingBindingableAPIs#va_list"><code>va_list</code></link>).
    </p>

    <p>
      <cmd>g-ir-scanner</cmd> emits warnings when it encounters code it does not
      understand. By passing <cmd>--warn-error</cmd> as well as
      <cmd>--warn-all</cmd> in <code>INTROSPECTION_SCANNER_ARGS</code> in
      <file>Makefile.am</file>, compilation will fail when unintrospectable APIs
      are encountered. This will ensure all new APIs are introspectable, and is
      highly recommended.
    </p>
  </section>
</page>